背景
采用flask框架搭建的web服务,有时会因某些未知的原因,突然挂掉,导致客户端请求失效。推测原因有可能是这个服务程序本身的原因,又或者是有某些电脑监控程序发现监控到,某些暴露的端口不常用,因此将该进程杀掉。无论哪种原因,都需要一个能够监控到该进程退出后,立即重启的脚本。本篇即是解决这个问题。
源码展示
版本1
#!/bin/sh
pyFile=servicecase.py
py=../miniconda3/bin/python
#cmd="ps -ef | grep $pyFile | grep -v "grep" | awk '{print $2}'"
while true
do
eval pid=`ps -ef | grep $pyFile | grep -v "grep" | awk '{print $2}'` #使用eval pid=$cmd无效
if [ $pid ]; then
#echo "process already exist!"
: #相当于pass
else
$py $pyFile &
eval pid=`ps -ef | grep $pyFile | grep -v "grep" | awk '{print $2}'`
echo "process has been restarted!, new pid:$pid"
fi
sleep 5
done
版本2
#!/bin/sh
pyFile=servicecase.py
py=../miniconda3/bin/python
cmd="ps -ef | grep $pyFile | grep -v "grep""
while true
do
eval $cmd > /dev/null # 不显示ps该语句的执行结果,因为是个循环,如果该程序在运行将会不断生成显示
if [ $? -eq 0 ]; then # $? 表示上一个命令,即eval ps等的返回结果是否有内容,没有返回1,有返回0
#echo "process already exist!"
: #相当于pass
else
$py $pyFile &
eval $cmd
echo "process has been restarted!, new pid:$pid"
fi
sleep 5
done
说明
servicecase.py 是包含flask的服务端代码
cmd 是获得执行这条命令 …/miniconda3/bin/python servicecase.py后该服务进程的进程号
eval 是执行后面这条语句
这里涉及到一个技术点,字符串命令。其实笔者是很不愿意,ps这条命令出现很多次的,因此将该条命令制作成一个字符串。通过 eval $cmd1来执行ps这条命令,可以执行,但是获取不到进程号。因此,如果想去掉这么多冗余的命令,完全用字符串替代,也可以用第二个版本,这个版本根据命令执行后是否有返回来进行分支执行,但是代价看不到进程号。
参考文档
LINUX使用ps命令获取对应PID
Shell命令替换:将命令的输出结果赋值给变量
Linux 写一个监控程序,监控某个进程是否在运行,如果停止,则自动重启
脚本中判断Shell命令执行结果