zl程序教程

您现在的位置是:首页 >  其他

当前栏目

shell脚本监控&自动拉起程序

2023-03-15 23:21:57 时间

自己在服务器跑一些需要长期运行的程序时,偶尔会因为一些奇怪的原因挂掉,如果要人为去检查很麻烦,因此最好能够实现自动的检测和挂掉拉起。

有一个好的工具是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