shell脚本监控&自动拉起程序
自己在服务器跑一些需要长期运行的程序时,偶尔会因为一些奇怪的原因挂掉,如果要人为去检查很麻烦,因此最好能够实现自动的检测和挂掉拉起。
有一个好的工具是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是为了保证我关闭终端后脚本依然运行,不然就会在我关闭终端时脚本也退出。
如果此时出现了“$' ':command not found”错误,那是因为脚本再win下编写,win的每行结尾是 ,而Unix 行尾标志是 ,就会认为这里的 是个字符,但是又不认识,因此报错。这时用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
相关文章
- 你的每行代码值多少钱?
- 游戏中的“战争黑雾”和现实中的程序员处境
- 【2014】GitHub中国开发者年度报告
- 盲人程序员是如何编程的?
- 你还不知道CIL?一个让你开发项目更有性价比的中间语言
- 与离岸外包开发团队合作的八项须知
- 程序员解决问题的 60 个策略
- 漫画迎2015:用幽默的语言解读2014年IT领域重大事件
- 挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的
- 微软收购R语言开发公司 强化云计算业务
- 使用Go语言来提升Ruby应用的性能
- 2014年最热门的国人开发开源软件TOP100
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- 不要浪费时间去写所谓的完美代码
- 成为高级程序员的 10 个步骤
- Facebook 创始人扎克伯格亲自审查核心代码
- 微软宣布 .NET 编译器 Roslyn 即将移到 Github
- 真实项目实践:快速定位 Spring MVC异常实战(附源码下载)
- 极端苛刻的CPU限制下仍能正常工作?Java不同压缩算法的性能比较
- 互联网组织的未来:剖析GitHub员工的任性之源