背景
采用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这条命令,可以执行,但是获取不到进程号。因此,如果想去掉这么多冗余的命令,完全用字符串替代,也可以用第二个版本,这个版本根据命令执行后是否有返回来进行分支执行,但是代价看不到进程号。