最近写了一个爬取程序,但是时不时的会因为网络波动断掉,又经常想不起来取检查,因此有时候一断就是浪费了好几天的时间,因此多方查找总结,自己写了一个bash脚本,可以实现:
#!/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
的命令的数量由于同时要挂多个进程,因此使用了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
然后就大功告成啦!