美文网首页IT技术专题
shell脚本监控&自动拉起程序

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

作者: Cloudox_ | 来源:发表于2019-08-15 15:12 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:shell脚本监控&自动拉起程序

        本文链接:https://www.haomeiwen.com/subject/xcezjctx.html