Linux下使用bash脚本监控程序并自动在screen中重启

起因

最近写了一个爬取程序,但是时不时的会因为网络波动断掉,又经常想不起来取检查,因此有时候一断就是浪费了好几天的时间,因此多方查找总结,自己写了一个bash脚本,可以实现:

  1. 每隔一段时间检查一遍程序是否还在运行
  2. 如果停止则自动在对应的screen窗口中运行对应的指令

监控脚本

#!/bin/sh
CheckProcess()
{   
    if [ `ps -ef|grep $1 | grep -v grep |wc -l`  -gt 0 ]; then
        echo "${1}正在运行"
    else
        echo "$(date "+%Y-%m-%d %H:%M:%S") ${1}已停止"
        echo "正在重启${1}"
        # 重启指令
    fi
}

while [[ true ]]; do
    echo "$(date "+%Y-%m-%d %H:%M:%S")"
    do
        CheckProcess "ProcessName"
    done
    sleep 5m
done

下面来对这段代码进行讲解:
首先来看 if 判断条件中的这句话

if [ `ps -ef|grep $1 | grep -v grep |wc -l`  -gt 0 ]
  • -gt是一个比较函数,意思是测试一个数是否大于另一个数;大于,为真;否则,为假。
  • ps -ef|grep $1 | grep -v grep |wc -l的作用是打印出系统中所有包含参数 $1 的命令,例如我需要监控的程序的命令行输入为:
    python main.py 2019-01,那么我此处的 $1 就可以设置为2019-01,这行命令就会打印出所有包含2019-01的命令的数量
  • 结合以上两条,如果我需要检测的命令能打印出来,说明程序正在运行,数量就会大于1,if会判断为真
  • Tips: 由于我的进程名比较特别不会有重复,如果你的进程名会和别的不要检测的进程名重复的话,建议修改一下代码换成监控pid,或者使用完整的进程

在Screen中重启进程

由于同时要挂多个进程,因此使用了screen指令。
使用以下命令可以在后台开启screen窗口并运行程序:
首先使用screen -R AAA创建一个AAA的窗口
然后使用

screen -x -S AAA -p 0 -X stuff "你的命令\n"

即可在后台静默打开AAA窗口并运行命令来重启程序了。

整合

建议分别打印前面两步的指令,验证一下是否和自己所想的一致,确认完毕以后就可以拼接作为一个监控脚本了:

# 首先创建脚本文件(并退出)
vim monitor.sh
# 然后设置权限
chmod +x monitor.sh

接着将完整的指令输入monitor.sh

#!/bin/sh
CheckProcess()
{   
    if [ `ps -ef|grep $1 | grep -v grep |wc -l`  -gt 0 ]; then
        echo "${1}正在运行"
    else
        echo "$(date "+%Y-%m-%d %H:%M:%S") ${1}已停止"      
        echo "正在重启${1}"
        screen -x -S AAA -p 0 -X stuff "你的命令\n"
    fi
}

while [[ true ]]; do
    echo "$(date "+%Y-%m-%d %H:%M:%S")"
    do
        CheckProcess "ProcessName"
    done
    sleep 5m
done

然后就大功告成啦!

你可能感兴趣的:(bash,linux,开发语言)