linux下的守護(hù)進(jìn)程
Linux下的常駐進(jìn)程的作用不可忽略,但這里面的問題也不能忽略,怎么啟動進(jìn)程,怎么結(jié)束進(jìn)程,怎么在進(jìn)程掛掉之后重啟進(jìn)程都要設(shè)計的合理。下面看一個shell控制的php常駐進(jìn)程的例子。
不廢話,直接撈干貨,上代碼,通過代碼來講解更容易理解:
#!/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
只里面有幾個要強調(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í)行一次,具體情況具體對待。
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}即可。
- linux shell實現(xiàn)守護(hù)進(jìn)程腳本
- php守護(hù)進(jìn)程 加linux命令nohup實現(xiàn)任務(wù)每秒執(zhí)行一次
- 詳解Linux中的守護(hù)進(jìn)程
- linux下如何創(chuàng)建守護(hù)進(jìn)程的步驟
- C語言編寫Linux守護(hù)進(jìn)程實例
- Python實現(xiàn)Linux下守護(hù)進(jìn)程的編寫方法
- Java實現(xiàn)Linux下雙守護(hù)進(jìn)程
- linux 守護(hù)進(jìn)程詳解及建立守護(hù)進(jìn)程
- Linux守護(hù)進(jìn)程的啟動方法
- linux守護(hù)進(jìn)程服務(wù)daemon、nohup、systemd的區(qū)別
相關(guān)文章
CentOS Linux 下配置Apache2+PHP5+MySQL5+GD庫的方法
先安裝MYSQL 服務(wù)器再安裝GD庫基本包2008-04-04