今天小編給大家分享一下linux守護進程實例代碼分析的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
獻縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)從2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
linux下的常駐進程的作用不可忽略,但這里面的問題也不能忽略,怎么啟動進程,怎么結(jié)束進程,怎么在進程掛掉之后重啟進程都要設(shè)計的合理。下面看一個shell控制的php常駐進程的例子。
復(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
#這里進行判斷如果runfile文件不存在,則表示該進程不存在,下面啟動進程
echo $$>${runfile}
while true
do
if [ ! -f $diefile ]; then
#這里如果diefile文件不存在,則表示程序繼續(xù)執(zhí)行,否則進入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的情況下試圖啟動該進程
oldpid=`cat $runfile`
newpid=`ps aux | grep "process.sh $1" | grep -v grep | grep "$oldpid" | awk '{print $2}'`
if [[ $oldpid -eq $newpid ]]; then
#如果runfile中的進程號和正在運行的目標(biāo)進程號一致,表明一切安好^_^
echo "the process is runing now"
exit
else
#如果用runfile中的進程號匹配不到正在運行的目標(biāo)進程,則表示進程有問題,直接刪除runfile并結(jié)束運行的進程
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
只里面有幾個要強調(diào)的地方:
我用這個shell去調(diào)用php程序,這個沒有局限性,這里要說明的是這種運行常駐進程的方法
在runfile存在,但進程號對不上殺進程時(也就是紅色額else所執(zhí)行的地方),一定要 `grep -v $$`,作用是過濾掉當(dāng)前運行的進程,要不然都被殺掉了,將后面的就不執(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í)行一次
這樣一個完整的常駐進程功能就完成了,想要終止進程是只需要在對應(yīng)的目錄下進行touch ${diefile}即可。
以上就是“l(fā)inux守護進程實例代碼分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。