工作中常常会遇到处理消息队列的消费者进程,这样的进程是一个守护进程,即一个服务。服务通常写个shell脚本来管理,查询服务的status ,启动start 关闭stop 重启reload。最近在学习shell,也模仿写了一个简单的服务管理脚本
首先贴出模拟的守护进程服务,PHP程序,命名demo.php
1 2 3 4 5 6 | <?php
while (true){
echo 'doing...' .PHP_EOL;
sleep(10);
}
?>
|
这是一个死循环,不停的输出。
管理的shell脚本如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #!/bin/bash
DEMO_SCRIPT= '/home/tianquanjun/study/service/demo.php' #服务脚本
DEMO_LOG= '/home/tianquanjun/study/service/demo.log' #服务运行日志
#判断程序是否已经在运行
status_script(){
pids=` ps aux| grep /home/tianquanjun/study/service/demo .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 来管理
由于守护进程容易死掉,所以我们也经常在ctontab中加入 定时重启任务
|