在Debian上使用脚本自动重启崩溃及异常退出的程序或服务
在一块ARM板上遇到了自编译含tun设备的内核导致tinc偶尔崩溃的情况,且systemd未能正常自动重启tinc服务。故尝试使用脚本配合crond实现自动检查进程和重启服务的功能。
脚本完整内容如下,部分和设备控制相关的内容已移除,该脚本修改相应的进程名后应该在Debian Server上能够直接使用:
#!/bin/bash
cmd=`ps aux | grep "tincd -n mynet" | grep -v "grep"`
result=$cmd
date
#echo $result
if [[ "$result" != "" ]]
then
echo "Tinc service is running"
exit 0
else
echo "Tinc service is not running, trying restart it"
cmd1=`/usr/sbin/service tinc@mynet restart`
cmd2=`ps aux | grep "tincd -n mynet" | grep -v "grep"`
result=$cmd2
if [[ "$result" != "" ]]
then
echo "Service recovered"
exit 0
else
echo "Restart service failed"
echo $cmd1
exit 1
fi
fi
该脚本首先运行以下命令
ps aux | grep "tincd -n mynet" | grep -v "grep"
并将结果保存为变量cmd,使用``号引起来的内容会被bash执行并返回结果。该执行的命令中,ps aux列出了系统中的所有进程,之后通过管道传给grep,它将含有关键字的几行筛选出来,之后再使用grep过滤掉含有grep的行,以免读取进程列表时,读取进程的进程也被返回到结果中。
之后判断读取的结果是否为空,若为空则表示目标进程未运行,那么重新运行该程序即可。此处使用service命令重启该服务,然后重新判断是否重启成功,否则返回一个失败的值。需要注意crond的环境变量与自己预设的环境变量可能不一致,需要使用service命令的绝对路径以确保正常执行。
脚本的第3行插入了一个date用于记录日志时存放时间戳。
将该脚本保存为.sh文件(以autorestart.sh为例,放在/root下,注意使用root权限),之后使用
chmod +x autorestart.sh
赋予可执行权限,
然后使用crontab -e加入以下行:
*/1 * * * * /root/autorestart.sh >>/tmp/autorestart.log
这样crond会每分钟执行一次该命令,并将输出结果存放到/tmp/autorestart.log下面。