logo
当前位置:首 页 > 云计算&大数据 > 查看文章

在开发项目上有一个进程守护的需求例如:在Linux平台,需要监听一个进程是否在运行,如果挂了就再自动开启。在window平台我们有出票软件,但是因为对接的是韩国的打印机【不知道是对接软件的问题还是什么特别容易报错】有时候软件出票报错直接GG了,所以需要一个监听的脚本

在Linux平台:一般是做一个脚本扔到开机启动,就好了:

  1. #! /bin/sh
  2. #进程名字可修改
  3. PRO_NAME=rails
  4. CMD="nohup bundle exec rails server webrick -p3000 -b 0.0.0.0 -e production >/dev/null 2>&1 -d &"
  5. while true ; do
  6. #用ps获取$PRO_NAME进程数量
  7. NUM=`ps aux | grep -w ${PRO_NAME} | grep -v grep |wc -l`
  8. #echo $NUM
  9. #少于1,重启进程
  10. if [ "${NUM}" -lt "1" ];then
  11. echo "${PRO_NAME} was killed"
  12. $CMD
  13. #大于1,杀掉所有进程,重启
  14. elif [ "${NUM}" -gt "1" ];then
  15. echo "more than 1 ${PRO_NAME},killall ${PRO_NAME}"
  16. killall -9 $PRO_NAME
  17. $CMD
  18. fi
  19. #kill僵尸进程
  20. NUM_STAT=`ps aux | grep -w ${PRO_NAME} | grep T | grep -v grep | wc -l`
  21. if [ "${NUM_STAT}" -gt "0" ];then
  22. killall -9 ${PRO_NAME}
  23. $CMD
  24. fi
  25. sleep 5s
  26. done
  27.  

 

脚本保存为 xxx.sh

设置脚本执行权限 chmod 777 xxx.sh

控制台执行则:./xxx.sh   这样就会保证始终存在一个xxxx程序的运行。

需要后台持续运行则:nohup ./xxx.sh &

 

这个也可以做成定时任务:

  1. #!/bin/bash
  2.  
  3. DEMO_SCRIPT='/dingshi.php' #服务脚本
  4. DEMO_LOG='/dingshi.log' #服务运行日志
  5.  
  6.  
  7.  
  8. #判断程序是否已经在运行
  9. status_script(){
  10. pids=`ps aux|grep /dingshi.php|grep -v grep|awk '{print $2}'`
  11. if [ ${pids} ]
  12. then
  13. echo ${0}'在运行中'
  14. return 1
  15. else
  16. echo $0'未启动'
  17. return 2
  18. fi
  19. }
  20.  
  21. #启动脚本,先判断脚本是否已经在运行
  22. start_script(){
  23. status_script
  24. if [ $? -eq 1 ]
  25. then
  26. echo ${0}' 已经在运行中了'
  27. else
  28. echo '启动'${0}'中...'
  29. nohup /usr/bin/php ${DEMO_SCRIPT}>${DEMO_LOG} &
  30. echo '启动完毕'
  31. fi
  32. }
  33.  
  34. #停止脚本
  35. stop_script(){
  36. status_script
  37. if [ $? -ne 1 ]
  38. then
  39. echo ${0}' 不是运行状态'
  40. else
  41. do
  42. kill -TERM ${pid} >/dev/null 2>&1
  43. done
  44. echo '停止完毕'
  45. fi
  46. }
  47.  
  48. #重启脚本
  49. reload_script(){
  50. stop_script
  51. start_script
  52. }
  53. #入口函数
  54. handle(){
  55. case $1 in
  56. start)
  57. start_script
  58. ;;
  59. stop)
  60. stop_script
  61. ;;
  62. status)
  63. status_script
  64. ;;
  65. reload)
  66. reload_script
  67. ;;
  68. *)
  69. echo 'USAGE OF THIS SERVER IS '${0} 'status|start|stop|restart';
  70. ;;
  71. esac
  72. }
  73.  
  74. if [ $# -eq 1 ]
  75. then
  76. handle $1
  77. else
  78. echo 'USAGE OF THIS SERVER IS '${0} 'status|start|stop|restart';
  79. fi

 

利用 ./demo.sh  status|start|stop|reload 来管理

 

 

在Windows平台,就是用CMD脚本或者软件了。针对出票软件的话我开发了一套看门狗软件,定时轮询这个进程,如果进程没响应或者跳出了就先截屏然后上传出票软件的日志到管理平台的设备管理接口【截图是为了看到没有捕获的异常的页面配合LOG日志的话90%以上的问题都可以定位解决】,如果是普通的小软件的话就弄个CMD的脚本就好了:

 

  1. :RESTART
  2. tasklist /FI "username eq administrator" | find /C "emule" > temp.txt
  3. set /p num=<temp.txt
  4. del /F temp.txt
  5.  
  6. if %num%==0 start /D "D:\Program Files\emule\" emule
  7.  
  8. cscript //nologo sleep.vbs
  9. goto RESTART

 

asklist是显示所有进程列表,/FI过滤出特定用户的进程,|是管道符么,windows下也有管道符么。。作用是将前面的输出作为后面的输入,find查找指定字符串,/C输出指定字符串出现的数量。只要驴子当掉了,find到的数量应该是0,则重新启动驴子。

cscript //nologo sleep.vbs这句是执行vbs脚本。sleep.vbs作用就是sleep一定时间(等于没说吧喂!),就一行内容,时间多少自行设定,我定了10分钟,是不是太短了呢?

 

  1. wscript.sleep(600000)

 

加上一个vbs脚本,来让难看的cmd窗口不用显示,crontab.vbs内容如下:

 

  1. createobject("wscript.shell").run "crontab.cmd",0

 

后面的参数0就表示不显示cmd窗口

 

说说梦想,谈谈感悟 ,聊聊技术,有啥要说的来github留言吧 https://github.com/cjx2328

—— 陈 建鑫

陈建鑫
你可能也喜欢Related Posts
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容。站长联系:cjx2328#126.com(修改#为@)
Copyright ©ziao Studio All Rights Reserved. E-mail:cjx2328#126.com(#号改成@) 沪ICP备14052271号-3