最近遇到公司DNS服务器unbound服务总是自动停掉的情况,准备创建个脚本,配合contab进行定时检测,如果发现进程掉了就自动拉起。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
文章目录
检测进程脚本
首先创建一个shell脚本check_unbound.sh
用来检测unbound进程,如果进程不存在则自动拉起
#!/bin/bash
# @Auther: Xiaofu
pid=`ps -ef | grep -w unbound | grep -v grep | awk '{print $2}'`
if [ -z "$pid" ];
then
echo `date +"%Y%m%d %H:%M:%S"`
echo unbound has stopped, will restart now...
systemctl restart unbound
pid=`ps -ef | grep -w unbound | grep -v grep | awk '{print $2}'`
echo new pid is $pid
fi
经过测试,有以下几点要注意:
- grep的时候用-w可以达到精准的单词匹配
- 赋值符号前后不能有空格
- shell中双引号有转义作用,在if语句那里要用双引号不然会报错
- systemctl是基于centos7的启动服务脚本,其余发行版本命令会有所不同
脚本加入crontab
想要将脚本加入crontab必须要脚本有执行权限
chmod a+x check_unbound.sh
之后通过命令crontab -e
开始编辑crontab,编辑的方法和vim一致。
每条规则单独一行,用空格分为7个字段。这里需要补充说明下crontab中每个字段的含义
分钟 小时 日 月 周 [用户名] 命令
- 第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
- 第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
- 第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
- 第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
- 第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
- 每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
- 第七段应该定义的是:执行的命令和参数。
如果是*
表示每一个单元都要执行,而如果想周期执行可以用*/n
,每隔n个周期执行i一次。
例如我想每隔5分钟执行一次脚本就可以用
*/5 * * * * command
这里我就直接保持默认,每隔一分钟执行一次脚本
* * * * * /bin/bash /root/check_unbound.sh >> /tmp/check_unbound.log
可以通过crontab -l
来查看现在在运行的contab脚本。
验证
接着我手动停掉unbound服务
systemctl stop unbound
过了约一分钟,发现服务被自动拉起,并且自动写入了log,验证成功。