最近在做服务器,因为是全天候运行,服务器也不是说百分之百稳定,永远不崩溃永不宕机啥的,所以就算宕机了也不要紧,关键是能及时启动,不能影响玩家体验,所以
必须得有守护进程守护着,如果服务器一崩溃,立马重启,保证整个业务能继续运行
我的启动脚本 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: ma6174@163.com # 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
再建一个会话
screen -dmS Urumchi 再看这个会话是事成功
screen -list 连上这个会话
再执行keep.sh脚本
./keep.sh > keep.log 2>&1 &