工作中常常会遇到处理消息队列的消费者进程,这样的进程是一个守护进程,即一个服务。服务通常写个shell脚本来管理,查询服务的status ,启动start 关闭stop 重启reload。最近在学习shell,也模仿写了一个简单的服务管理脚本
首先贴出模拟的守护进程服务,PHP程序,命名demo.php
<?php while(true){ echo 'doing...'.PHP_EOL; sleep(10); } ?>
这是一个死循环,不停的输出。
管理的shell脚本如下
#!/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中加入 定时重启任务