起因
轻量型服务器跑不了docker
享受不到restart的便利
某个服务挂了只能手动重启
很麻烦
解决方案
利用crontab定时执行【哨兵脚本】,若进程不在,则执行【启动脚本】
必备知识
crontab
Linux crontab 是用来定期执行程序的命令。
格式
f1 f2 f3 f4 f5 (env) program (output)
- f1 是表示分钟
- f2 表示小时
- f3 表示一个月份中的第几日
- f4 表示月份
- f5 表示一个星期中的第几天
- env(选填)使环境变量生效
- program 表示要执行的程序
- output(选填)处理日志输出和执行邮件
实例
* * * * * /bin/ls 每一分钟执行一次 /bin/ls
0 */2 * * * /sbin/service httpd restart 每两个小时重启一次apache
50 22 * * * /sbin/service sshd stop 每天22:50关闭ssh服务
环境变量
部分指令如docker、mongod等,均将其文件路径配置到PATH
若未添加下述命令,则cron无法通过环境变量PATH找到这些指令所在位置
在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
* * * * * . /etc/profile;/bin/sh /srv/mongo/bin/sentinel.sh
日志输出及邮件
当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容
You have new mail in /var/spool/mail/root
若是你不希望收到这样的邮件,请在每一行空一格之后加上 > /dev/null 2>&1 即可,如:
* * * * * . /etc/profile;/bin/sh /srv/mongo/bin/sentinel.sh > /dev/null 2>&1
当然也可以将每条 crontab中的任务增加自己的日志,有利于查找执行失败原因
以下是把错误输出和标准输出都输出到sentinel.log中
* * * * * . /etc/profile;/bin/sh /srv/mongo/bin/sentinel.sh >> /root/for_crontab/sentinel.log 2>&1
注意:单个右角符号【>】是覆写文件,会覆盖之前的内容;
双右角符号【>>】是续写文件,会在文件结尾继续写入新的内容。
相关指令
执行文字编辑器来设定时程表
crontab -e
列出目前的时程表
crontab -l
日志查询
cron输出日志默认在/var/log/cron
tail -200f /var/log/cron
哨兵脚本
完整示例:
#!/bin/bash
# 声明一个变量,记录mongodb存活的进程数量
mongoCount=`ps -ef|grep mongodb|grep -v grep| wc -l`
if [ $mongoCount -eq 0 ];
then
# 如果mongodb进程数量为0 则执行【启动脚本】
echo "mongodb is down!"
/srv/mongo/bin/startup.sh
else
# 如果mongodb进程数量不为0,则认为进程存活,echo后无需其他操作
echo "mongodb is running!"
fi
指令解释
- 查询当前进程,并过滤保留关键字[mongod]
ps -ef|grep mongod
[root@5kdj7 bin]# ps -ef|grep mongod
root 8321 1 20 14:38 ? 00:00:01 mongod -f /srv/mongo/mongodb.conf
root 8383 24959 0 14:38 pts/0 00:00:00 grep --color=auto mongod
- 查询当前进程,并过滤保留关键字[mongod],并过滤去除关键字[grep]
ps -ef|grep mongod|grep -v grep
[root@5kdj7 ~]# ps -ef|grep mongod|grep -v grep
root 9706 1 0 14:49 ? 00:00:07 mongod -f /srv/mongo/mongodb.conf
- 查询当前进程,并过滤保留关键字[mongod],并过滤去除关键字[grep],并进行单词计数(word count),-l 参数表示统计行数。
ps -ef|grep mongod|grep -v grep| wc -l
[root@5kdj7 ~]# ps -ef|grep mongod|grep -v grep| wc -l
1
网友评论