手头有个Node.js的web应用,host在linux主机上。刚开发完遇到个小问题,系统bug比较多经常不经意间操作,整个应该就crash了,还得手动重新启动node应用。当然这主要原因是我们的错误处理机制没完善,这事接下来的任务,当务之急是想写个小程序检测node应用,发现crash立马再次重启应用。这样给用户的体验会好些。
立马想到了Linux下单Cron,类似windows下面的task scheduler都是定时运行指定的程序。
配置
Cron使用Crontab来进行配置
crontab -l 显示当前用户的配置
crontab -e 修改当前用户的配置
crontab -r 删除配置
crontab -u 指定用户
格式
配置文件的格式如下:
* * * * * command to be executed ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───── day of week (0 - 6) (0 is Sunday, or use names) │ │ │ └────────── month (1 - 12) │ │ └─────────────── day of month (1 - 31) │ └──────────────────── hour (0 - 23) └───────────────────────── min (0 - 59)
Entry | Description | Equivalent To |
---|---|---|
@yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 1 1 * |
@monthly | Run once a month, midnight, first of month | 0 0 1 * * |
@weekly | Run once a week, midnight on Sunday | 0 0 * * 0 |
@daily | Run once a day, midnight | 0 0 * * * |
@hourly | Run once an hour, beginning of hour | 0 * * * * |
@reboot | Run at startup | @reboot |
crontab配置文件例子
进入编辑模式,crontab -e
加入如下语句:
*/1 * * * * /home/scripts/watchdog.sh >> /home/log/node.log
含义解释
每分钟运行watchdog脚本并把执行log输出到文件。
脚本内容
#!/bin/bash
content=$(ps -A | grep node)
if [ -z "$content" ]; then
echo "there is no Node process running, create it again."
exec /usr/local/bin/node /home/projects/pms/src/adv_pms/app.js >> /var/log/adv_pms.sys.log 2>&1
fi
检测node进程,如果程序crash进程号就没了为空, 然后重启node应用。
脚本完成,加上之前更改的crontab配置文件,没分钟检测node进程PID,如果没有了就立即重启!
注意事项
难者不会会者不难,就这简单的脚本折腾我半天,主要原因是对cron不太熟悉,开始我尝试写一个python的小程序,但用crontab调用会出问题,最后证明python里面的一些环境变量cron里面是没有的。就是说,程序在当前用户的环境里能运行,但在cron里面就有可能不行,这里一定要注意crontab里面的环境变量问题,尽量都使用绝对路径!