自己在服务器跑一些需要长期运行的程序时,偶尔会因为一些奇怪的原因挂掉,如果要人为去检查很麻烦,因此最好能够实现自动的检测和挂掉拉起。
有一个好的工具是supervisor,这是一套基于python的进程监控工具,能够进行简单的配置就达到我们的需求,为你监测你的进程并自动拉起挂掉的程序。
但如果你和我一样使用没有root权限的服务器,安装工具都是一件麻烦事,那也可以自己动手写一套shell脚本来监测和自动拉起,并不难。
以下就是我们的shell监测脚本monitor.sh:
#!/bin/bash
now=`date '+%Y-%m-%d %H:%M:%S'` # 定义log的时间格式
grepFlag='myWorkingProcess.js' # 你要监测的程序名
thisLog='./watchlog' # 该脚本的log日志文件
baseDir="."
sleepTime=60s # 监测间隔
# 检查是否有我们的拉起脚本run.sh
if [ ! -f "$baseDir/run.sh" ]; then
echo "$baseDir/run.sh missing, check again" >> "$thisLog"
exit
fi
# 无限循环(0<1)
while [ 0 -lt 1 ]
do
now=`date '+%Y-%m-%d %H:%M:%S'`
ret=`ps aux | grep "$grepFlag" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then # 如果ps找不到运行的目标进程就拉起
echo "$now process not exists ,restart process now... " >> "$thisLog"
./run.sh
echo "$now restart done ..... " >> "$thisLog"
else
echo "$now process exists , sleep $sleepTime seconds " >> "$thisLog"
fi
sleep $sleepTime
done
基本代码中都注释了,首先通过 -f 判断我们的拉起脚本run.sh是否存在。
然后通过一个无限循环(0小于1则循环)来用ps grep做目标进程的检查,如果不存在(ret返回0),那就拉起,如果存在,就只打log。然后sleep一段间隔时间。
这个sleep很自由,支持的时间单位有秒、分、时,默认的单位是秒。所以可以:
sleep 1 # 睡眠1秒
sleep 1s # 睡眠1秒
sleep 1m # 睡眠1分
sleep 1h # 睡眠1小时
自行根据业务场景选择间隔时间。
注意这里的baseDir变量,我是将带监控的程序、检测脚本、拉起脚本都放在同一个目录下了,所以一个 . 足矣,具体要根据自己的目录结构来修改。
代码中可以看到我们把echo的log输出都放到指定的日志文件中去了,这里我们用的是>>,如果用>,那么每次打log都会覆盖全文,从头开始写,如果用>>,就是在文件末尾接着写,看具体需要,如果间隔太短,建议覆盖。
然后我们写拉起脚本run.sh
nohup node myWorkingProcess.js > log_myWorkingProcess.log 2>&1 &
拉起脚本很简单,就是你平常启动程序时的语句,这里我用了nohup+&来后台运行程序,并制定程序的输出日志文件,指定log输出到myWorkingProcess.log,2>&1将标准出错重定向到标准输出,也就是不管是错误日志还是常规日志都输出到同一个文件。
此时就可以运行monitor脚本来开始监控了。
nohup sh ./monitor.sh &
这里我同样使用nohup+&,&是为了让脚本在后台运行,不影响我在终端做其他命令操作,nohup是为了保证我关闭终端后脚本依然运行,不然就会在我关闭终端时脚本也退出。
如果此时出现了“$'\r':command not found”错误,那是因为脚本再win下编写,win的每行结尾是\r\n,而Unix 行尾标志是\n,就会认为这里的\r是个字符,但是又不认识,因此报错。这时用dos2unix工具处理一下即可:
dos2unix monitor.sh
dos2unix run.sh
再运行就不会报错了。
此时可以去日志文件看看,已经有日志了。也可以手动kill掉监测的进程,看看是否会自动拉起。
References:
https://www.chenyudong.com/archives/bash-shell-watch-dog-auto-restart-process.html
https://blog.csdn.net/xiaojun111111/article/details/82752599
https://blog.csdn.net/xiaojun111111/article/details/82752599
网友评论