需求场景
经常会用php定期执行一些任务,于是使用cli方式运行php,加入个死循环即可,但是不知道为什么php脚本会经常无故死掉,所以写了个sh脚本,结合系统的cron来实现监控。cron每分钟执行一次,如果进程存在则跳过,反之则执行。
#!/bin/bash
ps -fe|grep "/home/ayhome/push/index.php cli/index/index" |grep -v grep
if [ $? -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 1
fi
#
# 定义变量
#
#---------------------------------------------
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:restart
while getopts "m:c:a:l:h:k:p:s:d:r:" opt
do
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]"
;;
esac
done
psc="/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
exit
elif [[ $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
exit
elif [[ $k = "restart" ]]; then #重启进程
ps -eaf |grep "$psc" | grep -v "grep"| awk '{print $2}'|xargs kill -9
echo 'restart'
elif [[ $k = "test" ]]; then
$psc
exit
fi
if [ "${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'
fi
fi