linux下的守護(hù)進(jìn)程
Linux下的常駐進(jìn)程的作用不可忽略,但這里面的問(wèn)題也不能忽略,怎么啟動(dòng)進(jìn)程,怎么結(jié)束進(jìn)程,怎么在進(jìn)程掛掉之后重啟進(jìn)程都要設(shè)計(jì)的合理。下面看一個(gè)shell控制的php常駐進(jìn)程的例子。
不廢話(huà),直接撈干貨,上代碼,通過(guò)代碼來(lái)講解更容易理解:
#!/bin/sh
#filename test.sh
#絕對(duì)定位該文件的位置,不隨執(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)程不存在,下面啟動(dòng)進(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的情況下試圖啟動(dòng)該進(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)程號(hào)和正在運(yùn)行的目標(biāo)進(jìn)程號(hào)一致,表明一切安好^_^
echo "the process is runing now"
exit
else
#如果用RunFile中的進(jìn)程號(hào)匹配不到正在運(yùn)行的目標(biāo)進(jìn)程,則表示進(jìn)程有問(wèn)題,直接刪除RunFile并結(jié)束運(yùn)行的進(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
只里面有幾個(gè)要強(qiáng)調(diào)的地方:
我用這個(gè)shell去調(diào)用php程序,這個(gè)沒(méi)有局限性,這里要說(shuō)明的是這種運(yùn)行常駐進(jìn)程的方法
在RunFile存在,但進(jìn)程號(hào)對(duì)不上殺進(jìn)程時(shí)(也就是紅色額else所執(zhí)行的地方),一定要 `grep -v $$`,作用是過(guò)濾掉當(dāng)前運(yùn)行的進(jìn)程,要不然都被殺掉了,將后面的就不執(zhí)行了
還有一個(gè)要注意的地方就是關(guān)于自動(dòng)重啟了
自動(dòng)重啟可以放在crontab中,每隔一段時(shí)間執(zhí)行一次,具體情況具體對(duì)待。
crontab -e
#打開(kāi)當(dāng)前用戶(hù)日程表,添加模式
#日程表中有5個(gè)星號(hào),f1,f2,f3,f4,f5,
#其中f1表示分,f2表示時(shí),f3表示日,f4表示月,f5表示一個(gè)星期第幾天
#*表示每分/時(shí)/日/月/周天,*/n表示每n分/時(shí)/......執(zhí)行一次
*/2 * * * * /root/test.sh
#沒(méi)2分鐘執(zhí)行一次
這樣一個(gè)完整的常駐進(jìn)程功能就完成了,想要終止進(jìn)程是只需要在對(duì)應(yīng)的目錄下進(jìn)行touch ${DieFile}即可。
- linux shell實(shí)現(xiàn)守護(hù)進(jìn)程腳本
- php守護(hù)進(jìn)程 加linux命令nohup實(shí)現(xiàn)任務(wù)每秒執(zhí)行一次
- 詳解Linux中的守護(hù)進(jìn)程
- linux下如何創(chuàng)建守護(hù)進(jìn)程的步驟
- C語(yǔ)言編寫(xiě)Linux守護(hù)進(jìn)程實(shí)例
- Python實(shí)現(xiàn)Linux下守護(hù)進(jìn)程的編寫(xiě)方法
- Java實(shí)現(xiàn)Linux下雙守護(hù)進(jìn)程
- linux 守護(hù)進(jìn)程詳解及建立守護(hù)進(jìn)程
- Linux守護(hù)進(jìn)程的啟動(dòng)方法
- linux守護(hù)進(jìn)程服務(wù)daemon、nohup、systemd的區(qū)別
相關(guān)文章
CentOS Linux 下配置Apache2+PHP5+MySQL5+GD庫(kù)的方法
先安裝MYSQL 服務(wù)器再安裝GD庫(kù)基本包2008-04-04Centos7下用戶(hù)登錄失敗N次后鎖定用戶(hù)禁止登陸的方法
這篇文章主要給大家介紹了關(guān)于在Centos7系統(tǒng)下用戶(hù)登錄失敗N次后鎖定用戶(hù)禁止登陸的相關(guān)資料,文中先對(duì)PAM的配置文件進(jìn)行了簡(jiǎn)單的介紹,然后通過(guò)示例代碼將實(shí)現(xiàn)的方法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2018-01-01