在一块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下面。

标签: Linux, Debian

添加新评论