共計 1745 個字符,預計需要花費 5 分鐘才能閱讀完成。
今天丸趣 TV 小編給大家分享一下 linux 守護進程實例代碼分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
linux 下的常駐進程的作用不可忽略,但這里面的問題也不能忽略,怎么啟動進程,怎么結束進程,怎么在進程掛掉之后重啟進程都要設計的合理。下面看一個 shell 控制的 php 常駐進程的例子。
復制代碼 代碼如下:
#!/bin/sh
#filename test.sh
# 絕對定位該文件的位置,不隨執行目錄而變化
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 文件不存在,則表示程序繼續執行,否則進入 else,執行退出操作
/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 中的進程號和正在運行的目標進程號一致,表明一切安好 ^_^
echo the process is runing now
exit
else
#如果用 runfile 中的進程號匹配不到正在運行的目標進程,則表示進程有問題,直接刪除 runfile 并結束運行的進程
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
只里面有幾個要強調的地方:
我用這個 shell 去調用 php 程序,這個沒有局限性,這里要說明的是這種運行常駐進程的方法
在 runfile 存在,但進程號對不上殺進程時(也就是紅色額 else 所執行的地方),一定要 `grep -v $$`,作用是過濾掉當前運行的進程,要不然都被殺掉了,將后面的就不執行了
還有一個要注意的地方就是關于自動重啟了
自動重啟可以放在 crontab 中,每隔一段時間執行一次,具體情況具體對待。
復制代碼 代碼如下:
crontab -e
# 打開當前用戶日程表,添加模式
# 日程表中有 5 個星號,f1,f2,f3,f4,f5,
# 其中 f1 表示分,f2 表示時,f3 表示日,f4 表示月,f5 表示一個星期第幾天
#* 表示每分 / 時 / 日 / 月 / 周天,*/ n 表示每 n 分 / 時 /…… 執行一次
*/2 * * * * /root/test.sh
# 沒 2 分鐘執行一次
這樣一個完整的常駐進程功能就完成了,想要終止進程是只需要在對應的目錄下進行 touch ${diefile}即可。
以上就是“linux 守護進程實例代碼分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,丸趣 TV 小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注丸趣 TV 行業資訊頻道。