shell实现守护进程
作者:罗然
链接:https://www.zhihu.com/question/20356184/answer/75935631
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#!/bin/bash
# 直接上代码吧
# watchdog.sh
#定义映射表 k=进程号 v=作业
declare -A mapper
#进程号文件
conf=dog.pid
function debug
{
echo $@
}
#param pid 进程号
#使用ps命令查询该进程是否存在,如果不存在返回"gone",否则返回"stay"
function watch
{
local pid=$1
local index=`ps -ef|awk '{print $2}'|grep -P "^${pid}$"`
if [ "${index}None" = "None" ]; then
echo gone
return
fi
echo stay
}
#每过5秒钟检查一遍所有的进程,调用上面的watch
function dogit
{
while [ 1 ]
do
sleep 5
for pid in ${!mapper[@]}
do
debug pid:$pid
local t=`watch $pid`
debug "test result is $t!!!"
if [ "$t" = "gone" ]; then
debug "$c with pid $pid was gone"
loadscript ${mapper[$pid]}
unset mapper[$pid]
sed -i "/$pid/d" $conf
fi
done
done
}
#从作业文件加载需要守护的作业命令
function loadscript
{
local script=$@
debug script=$script
$script > /dev/null &
local pid=$!
mapper[$pid]=$script
echo $pid >> $conf
}
function clean
{
if [ -f $conf ]; then
while read line; do
if [ -n "$line" ]; then
pid=`ps -ef|awk '{print $2}'|grep $line|grep -v 'grep'`
if [ -n "${pid}" ]; then
debug killing $pid
kill $pid
fi
fi
done < $conf
fi
echo > $conf
debug done!
}
function main
{
clean
local file=$1
if [ -f $file ]; then
while read line
do
loadscript $line
done < $file
dogit
else
echo "Not a file!"
fi
}
main $1;
如何使用?建立一个文件里面是你需要守护的进程执行语句比如bone.txt 内容如下
python /home/rowland/pyspace/myweb.py -p 8800 python /home/rowland/pyspace/myweb.py -p 8801 python /home/rowland/pyspace/myweb.py -p 8802
然后
./watchdog bone.txt