工作中常常會遇到處理消息隊列的消費者進程,這樣的進程是一個守護進程,即一個服務。服務通常寫個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中加入 定時重啟任務
