使用 crontab 进行程序保活

背景

为了保证系统运行可靠,有时候需要对程序进行监测,当程序异常挂掉的时候能够自动快速拉起。在一些对时效性要求不那么高的场景下,使用 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
...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值