在开发项目上有一个进程守护的需求例如:在Linux平台,需要监听一个进程是否在运行,如果挂了就再自动开启。在window平台我们有出票软件,但是因为对接的是韩国的打印机【不知道是对接软件的问题还是什么特别容易报错】有时候软件出票报错直接GG了,所以需要一个监听的脚本
在Linux平台:一般是做一个脚本扔到开机启动,就好了:
- #! /bin/sh
- #进程名字可修改
- PRO_NAME=rails
- CMD="nohup bundle exec rails server webrick -p3000 -b 0.0.0.0 -e production >/dev/null 2>&1 -d &"
- while true ; do
- #用ps获取$PRO_NAME进程数量
- NUM=`ps aux | grep -w ${PRO_NAME} | grep -v grep |wc -l`
- #echo $NUM
- #少于1,重启进程
- if [ "${NUM}" -lt "1" ];then
- echo "${PRO_NAME} was killed"
- $CMD
- #大于1,杀掉所有进程,重启
- elif [ "${NUM}" -gt "1" ];then
- echo "more than 1 ${PRO_NAME},killall ${PRO_NAME}"
- killall -9 $PRO_NAME
- $CMD
- fi
- #kill僵尸进程
- NUM_STAT=`ps aux | grep -w ${PRO_NAME} | grep T | grep -v grep | wc -l`
- if [ "${NUM_STAT}" -gt "0" ];then
- killall -9 ${PRO_NAME}
- $CMD
- fi
- sleep 5s
- done
-
- exit 0
脚本保存为 xxx.sh
设置脚本执行权限 chmod 777 xxx.sh
控制台执行则:./xxx.sh 这样就会保证始终存在一个xxxx程序的运行。
需要后台持续运行则:nohup ./xxx.sh &
这个也可以做成定时任务:
- #!/bin/bash
-
- DEMO_SCRIPT='/dingshi.php' #服务脚本
- DEMO_LOG='/dingshi.log' #服务运行日志
-
-
-
- #判断程序是否已经在运行
- status_script(){
- pids=`ps aux|grep /dingshi.php|grep -v grep|awk '{print $2}'`
- if [ ${pids} ]
- then
- echo ${0}'在运行中'
- return 1
- else
- echo $0'未启动'
- return 2
- fi
- }
-
- #启动脚本,先判断脚本是否已经在运行
- start_script(){
- status_script
- if [ $? -eq 1 ]
- then
- echo ${0}' 已经在运行中了'
- else
- echo '启动'${0}'中...'
- nohup /usr/bin/php ${DEMO_SCRIPT}>${DEMO_LOG} &
- echo '启动完毕'
- fi
- }
-
- #停止脚本
- stop_script(){
- status_script
- if [ $? -ne 1 ]
- then
- echo ${0}' 不是运行状态'
- else
- do
- kill -TERM ${pid} >/dev/null 2>&1
- done
- echo '停止完毕'
- fi
- }
-
- #重启脚本
- reload_script(){
- stop_script
- sleep 4
- start_script
- }
- #入口函数
- handle(){
- case $1 in
- start)
- start_script
- ;;
- stop)
- stop_script
- ;;
- status)
- status_script
- ;;
- reload)
- reload_script
- ;;
- *)
- echo 'USAGE OF THIS SERVER IS '${0} 'status|start|stop|restart';
- ;;
- esac
- }
-
- if [ $# -eq 1 ]
- then
- handle $1
- else
- echo 'USAGE OF THIS SERVER IS '${0} 'status|start|stop|restart';
- fi
利用 ./demo.sh status|start|stop|reload 来管理
在Windows平台,就是用CMD脚本或者软件了。针对出票软件的话我开发了一套看门狗软件,定时轮询这个进程,如果进程没响应或者跳出了就先截屏然后上传出票软件的日志到管理平台的设备管理接口【截图是为了看到没有捕获的异常的页面配合LOG日志的话90%以上的问题都可以定位解决】,如果是普通的小软件的话就弄个CMD的脚本就好了:
- :RESTART
- tasklist /FI "username eq administrator" | find /C "emule" > temp.txt
- set /p num=<temp.txt
- del /F temp.txt
-
- if %num%==0 start /D "D:\Program Files\emule\" emule
-
- cscript //nologo sleep.vbs
- goto RESTART
asklist是显示所有进程列表,/FI过滤出特定用户的进程,|是管道符么,windows下也有管道符么。。作用是将前面的输出作为后面的输入,find查找指定字符串,/C输出指定字符串出现的数量。只要驴子当掉了,find到的数量应该是0,则重新启动驴子。
cscript //nologo sleep.vbs这句是执行vbs脚本。sleep.vbs作用就是sleep一定时间(等于没说吧喂!),就一行内容,时间多少自行设定,我定了10分钟,是不是太短了呢?
加上一个vbs脚本,来让难看的cmd窗口不用显示,crontab.vbs内容如下:
- createobject("wscript.shell").run "crontab.cmd",0
后面的参数0就表示不显示cmd窗口