linux守護(hù)進(jìn)程實例代碼分析

linux下的常駐進(jìn)程的作用不可忽略,但這里面的問題也不能忽略,怎么啟動進(jìn)程,怎么結(jié)束進(jìn)程,怎么在進(jìn)程掛掉之后重啟進(jìn)程都要設(shè)計的合理。下面看一個shell控制的php常駐進(jìn)程的例子。

復(fù)制代碼?代碼如下:

#!/bin/sh
#filename test.sh
#絕對定位該文件的位置,不隨執(zhí)行目錄而變化
cd $(cd “$(dirname “$0″)”;pwd)
readonly path=$(pwd)/
file=$1;
runfile=”${path}data/${file}.run”
diefile=”${path}data/${file}.die”
readonly file=”${path}${file}.php”
if [ ! -f “$file” ]; then
??? echo “please select a exists file”
elif [ ! -f “$runfile” ]; then
#這里進(jìn)行判斷如果runfile文件不存在,則表示該進(jìn)程不存在,下面啟動進(jìn)程
??? echo $$>${runfile}
??? while true
??????? do
??????????? if [ ! -f $diefile ]; then
??????????? #這里如果diefile文件不存在,則表示程序繼續(xù)執(zhí)行,否則進(jìn)入else,執(zhí)行退出操作
??????????????? /usr/bin/php -f ${file}
??????????????? touch $runfile
??????????????? sleep 1
??????????? else
??????????? #如果diefile文件存在清除runfile和diefile退出
??????????????? if rm -rf $runfile && rm -rf $diefile ; then
??????????????????? exit
??????????????? fi
??????????? fi
??????? done
else
#這里是在存在runfile的情況下試圖啟動該進(jìn)程
??? oldpid=`cat $runfile`
??? newpid=`ps aux | grep “process.sh $1” | grep -v grep | grep “$oldpid” | awk ‘{print $2}’`
??? if [[ $oldpid -eq $newpid ]]; then
??? #如果runfile中的進(jìn)程號和正在運行的目標(biāo)進(jìn)程號一致,表明一切安好^_^
??????? echo “the process is runing now”
??????? exit
??? else
??? #如果用runfile中的進(jìn)程號匹配不到正在運行的目標(biāo)進(jìn)程,則表示進(jìn)程有問題,直接刪除runfile并結(jié)束運行的進(jìn)程
??????? echo “error situation,kill the run process and delete the run file”
??????? ps aux | grep “process.sh $1” | grep -v ‘grep’ | awk ‘{print $2}’ | grep -v $$ | xargs –no-run-if-empty kill
??????? if [ $? -eq 0 ]; then
??????????? rm -f $runfile
??????? else
??????????? echo $?>${path}/data/error
??????? fi
??? fi
fi

只里面有幾個要強(qiáng)調(diào)的地方:

我用這個shell去調(diào)用php程序,這個沒有局限性,這里要說明的是這種運行常駐進(jìn)程的方法
在runfile存在,但進(jìn)程號對不上殺進(jìn)程時(也就是紅色額else所執(zhí)行的地方),一定要 `grep -v $$`,作用是過濾掉當(dāng)前運行的進(jìn)程,要不然都被殺掉了,將后面的就不執(zhí)行了
還有一個要注意的地方就是關(guān)于自動重啟了
自動重啟可以放在crontab中,每隔一段時間執(zhí)行一次,具體情況具體對待。

復(fù)制代碼?代碼如下:

crontab -e
#打開當(dāng)前用戶日程表,添加模式
#日程表中有5個星號,f1,f2,f3,f4,f5,
#其中f1表示分,f2表示時,f3表示日,f4表示月,f5表示一個星期第幾天??
#*表示每分/時/日/月/周天,*/n表示每n分/時/……執(zhí)行一次
*/2 * * * * /root/test.sh
#沒2分鐘執(zhí)行一次

這樣一個完整的常駐進(jìn)程功能就完成了,想要終止進(jìn)程是只需要在對應(yīng)的目錄下進(jìn)行touch ${diefile}即可。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享