背景
为了保证系统运行可靠,有时候需要对程序进行监测,当程序异常挂掉的时候能够自动快速拉起。在一些对时效性要求不那么高的场景下,使用 crontab 定时检查也是一个可选方案,本文分享一个简单的程序保活的方法。
方法
1. 首先,编写一个 shell 脚本,执行检查存活和程序拉起的逻辑:
创建一个 check_alive.sh
文件,内容如下(你需要根据自己的需要修改逻辑):
#!/bin/bash
# 注意 crontab 默认没有配置环境变量 $PATH,这里需要显示声明(常见坑~)
# 如果你发现通过 crontab 执行脚本与手动直接执行结果不一致,应首先考虑环境变量
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
pid_cnts=$(ps -ef | grep ultrahook | grep -v grep | wc -l)
if [ $pid_cnts -eq 0 ];then
echo "No available ultrahook worker, starting one, $(date)"
ultrahook stripe 80 >> /root/ultrahook.log &
sleep 3
cnt=$(ps -ef | grep ultrahook | grep -v grep | wc -l)
if [ $cnt -gt 0 ];then
echo "Restarting ultrahook done."
fi
else
echo "ultrahook working ok, pid_cnts = $pid_cnts, $(date)"
fi
记得赋予脚本执行权限:
# chmod +x check_alive.sh
2. 配置 crontab 定时任务
执行 crontab -e
进入定时任务编辑窗口,设置定时任务(每5分钟执行一次):
*/5 * * * * /root/check-alive.sh 2&>1 >> /root/check-alive.log
上述方式会将脚本输出日志重定向到指定的文件。如果没有主动重定向,那么脚本产生的日志会存储在用户邮件消息内(例如 /var/spool/mail/root
)
保存退出后,可以通过执行 crontab -l
查看已经设置的定时任务
# crontab -l
*/5 * * * * /root/check-alive.sh 2&>1 >> /root/check-alive.log
在线生成 crontab 规则的工具:http://tool.lu/crontab
3. 验证定时任务是否工作
首先,可以通过查看日志,确定定时任务是否已经执行了:
# cat check-alive.log
ultrahook working ok, pid_cnts = 1, Sat Feb 22 10:40:01 EST 2020
其次,可以查看 crontab 是否处于开启状态:
# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 22:06:31 EDT; 8 months 26 days ago
Main PID: 6445 (crond)
Tasks: 1
Memory: 900.0K
CGroup: /system.slice/crond.service
└─6445 /usr/sbin/crond -n
Feb 22 10:25:01 centos-01 crond[6445]: (root) RELOAD (/var/spool/cron/root)
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
4. 设置日志自动轮换
为了避免日志长期存储占据大量磁盘空间,我们可以基于 logrotate 配置日志自动轮换
在 /etc/logrotate.d
文件夹下新建一个配置文件(例如命名为 check-alive
),告诉 logrotate 如何轮换我们的日志文件
/root/check-alive.log
/root/ultrahook.log
{
rotate 5
size 20M
compress
copytruncate
dateext
}
上述配置的主要意思是:最多保留5份日志,日志文件超过 20M 即压缩存档,清空前复制日志文件,存档文件后缀以日期命名。
可以通过手动执行一次备份,验证配置是否正确:
# logrotate -vf check-alive
reading config file check-alive
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /root/check-alive.log forced from command line (5 rotations)
empty log files are rotated, old logs are removed
considering log /root/check-alive.log
log needs rotating
rotating log /root/check-alive.log, log->rotateCount is 5
dateext suffix '-20200223'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /root/check-alive.log to /root/check-alive.log-20200223
set default create context to unconfined_u:object_r:admin_home_t:s0
truncating /root/check-alive.log
compressing log with: /bin/gzip
set default create context to unconfined_u:object_r:admin_home_t:s0
set default create context
...