1. 程式人生 > >用shell 指令碼寫守護程序

用shell 指令碼寫守護程序

最近在做伺服器,因為是全天候執行,伺服器也不是說百分之百穩定,永遠不崩潰永不宕機啥的,所以就算宕機了也不要緊,關鍵是能及時啟動,不能影響玩家體驗,所以

必須得有守護程序守護著,如果伺服器一崩潰,立馬重啟,保證整個業務能繼續執行

我的啟動指令碼 start.sh

#!/bin/sh
killall -9 logserver
sleep 1
killall -9 gameserver
mv logserver.log /mnt/share/log/logserver.log.bak
mv gameserver.log /mnt/share/log/gameserver.log.bak
ulimit -c unlimited
nohup ./logserver > logserver.log 2>&1 &
sleep 5
nohup ./gameserver > gameserver.log 2>&1 &
sleep 5
echo start success

守護程序指令碼 keep.sh
#########################################################################
# File Name: keep.sh
# Author: ma6174
# mail: [email protected]
# Created Time: Fri 16 Jan 2015 07:49:46 PM CST
#########################################################################
#!/bin/bash
num=1
iNum=1
echo $$
while(( $num < 5 ))
do
sn=`ps -ef | grep ./gameserver | grep -v grep |awk '{print $2}'`
echo $sn
if [ "${sn}" = "" ]    #如果為空,表示程序未啟動
then
let "iNum++"
echo $iNum
cp gameserver.log /mnt/share/log/gameserver_$iNum.log.bak
rm gameserver.log
nohup ./gameserver > gameserver.log 2>&1 & #後臺啟動程序
echo start ok !
else
echo running
fi
sleep 5
done

整個流程是

1. ./start.sh

2. ./keep.sh > keep.log 2>&1 &

注意  在 keep.sh 裡面 echo $$ 是輸出當前程序號,因為shell 指令碼啟動之後,是很難去查其程序號,沒有程序號,就很難殺死該shell指令碼啟動對應的

程序 ,從keep.log 找到該程序號,kill -s 9 pid 即可

./keep.sh > keep.log 2>&1 &  這個一定要這麼寫,因為大部分是通過終端連線ubuntu,直接./keep.sh 的話就沒法在後端執行,如果終端關閉,那該指令碼對應的程序也被自動殺死掉,守護程序就不存在了

最近重新試了一次,發現  ./keep.sh > keep.log 2>&1 & 確實可以在後臺執行,但是關掉終端之後,收到hup訊號,該指令碼還是中

斷了,起不了效果。用nohup 也提示很多錯誤,keep.sh這個指令碼還是跑不起來,看來不能終端上執行  ./keep.sh > keep.log 2>&1 & 只能在 screen 會話模式, 關於screen 可以見如下文件

https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

先安裝screen

apt-get install screen 

再建一個會話
screen -dmS Urumchi

再看這個會話是事成功
screen -list

連上這個會話
screen -r Urumchi

再執行keep.sh指令碼
./keep.sh > keep.log 2>&1 &