红联Linux门户
Linux帮助

用shell脚本写守护进程

发布时间:2016-09-22 09:52:10来源:linux网站作者:guoyilongedu
最近在做服务器,因为是全天候运行,服务器也不是说百分之百稳定,永远不崩溃永不宕机啥的,所以就算宕机了也不要紧,关键是能及时启动,不能影响玩家体验,所以必须得有守护进程守护着,如果服务器一崩溃,立马重启,保证整个业务能继续运行。
 
我的启动脚本 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 2016 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 的话就没法在后端运行,如果终端关闭,那该脚本对应的进程也被自动杀死掉,守护进程就不存在了。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24372.html