需求场景
经常会用php定期执行一些任务,于是使用cli方式运行php,加入个死循环即可,但是不知道为什么php脚本会经常无故死掉,所以写了个sh脚本,结合系统的cron来实现监控。cron每分钟执行一次,如果进程存在则跳过,反之则执行。
#!/bin/bashps -fe|grep "/home/ayhome/push/index.php cli/index/index" |grep -v grepif [ $? -ne 0 ]then echo "start process....." nohup /www/wdlinux/php/bin/php /home/ayhome/push/index.php cli/index/index &else echo "runing....."fi
扩展
- 需要自定义更多的参数,例如指定执行 模块、控制器、方法 即 m c a 参数
- 根据参数列出所有进程
- 结束 根据参数列出的所有进程
- 重启 根据参数列出的进程
- 指定进程数
为了完成以上要求,重新脚本如下。
#!/bin/bash#---------------------------------------------if [ $# -lt 2 ]then echo "Error! Not Enough Arguments." #默认情况下不让执行 echo "$0 $@" exit 1fi## 定义变量##---------------------------------------------p=index.php; #脚本文件m=index; c=index; a=index; l=1; #循环次数k=''; #操作 默认为空 kill 表示杀死指定进程 list 表示列出进程r=''; d=''; s=''; #---------------------------------------------# h:help# p:path defautl index.php# k:kill restart test# s:start# d:down# r:restartwhile getopts "m:c:a:l:h:k:p:s:d:r:" optdo case $opt in k) k=$OPTARG ;; p) p=$OPTARG ;; m) m=$OPTARG ;; c) c=$OPTARG ;; a) a=$OPTARG ;; l) l=$OPTARG ;; h) echo "Usage : sh cron -m index[default] -c index[default] -a index[default] -l 1[default]" ;; *) echo "Usage : sh cron -m index[default] -c index[default] -a index[default] -l 1[default]" ;; esacdonepsc="/www/wdlinux/php/bin/php /home/ayhome/wiwid/$p $m/$c/$a";# 获取进程号sn=`ps -ef|grep "$psc" |grep -v grep|awk '{print $2}'`;# 列出所有进程if [[ $k = "list" ]]; then ps -fe|grep "$psc" |grep -v grep exitelif [[ $k = "kill" ]]; then #杀死所有进程 # 先判断是否有进程 if [[ "${sn}" = "" ]]; then echo 'no runing' else ps -eaf |grep "$psc" | grep -v "grep"| awk '{print $2}'|xargs kill -9 echo 'kill all' fi exitelif [[ $k = "restart" ]]; then #重启进程 ps -eaf |grep "$psc" | grep -v "grep"| awk '{print $2}'|xargs kill -9 echo 'restart'elif [[ $k = "test" ]]; then $psc exitfiif [ "${sn}" = "" ] #如果为空,表示进程未启动then for (( i = 0; i < $l; i++ )); do nohup $psc & done echo start ok !else if [[ $k = "kill" ]]; then kill 9 $sn echo 'kill' else echo 'runing' fifi