linux下的常駐程序的作用不可忽略,但這裡面的問題也不能忽略,怎麼啟動程序,怎麼結束程序,怎麼在程序掛掉之後重啟程序都要設計的合理。下面看乙個shell控制的php常駐程序的例子。
不廢話,直接撈乾貨,上**,通過**來講解更容易理解:
複製** **如下:
#!/bin/sh
#filename test.sh
#絕對定位該檔案的位置,不隨執行目錄而變化
cd $(cd "$(dirname "$0")";pwd)
readonly path=$(pwd)/
file=$1;
runfile="$data/$.run"
diefile="$data/$.die"
readonly file="$$.php"
if [ ! -f "$file" ]; then
echo "please select a exists file"
elif [ ! -f "$runfile" ]; then
#這裡進行判斷如果runfile檔案不存在,則表示該程序不存在,下面啟動程序
echo $$>$
while true
doif [ ! -f $diefile ]; then
#這裡如果diefile檔案不存在,則表示程式繼續執行,否則進入else,執行退出操作
/usr/bin/php -f $
touch $runfile
sleep 1
else
#如果diefile檔案存在清除runfile和diefile退出
if rm -rf $runfile && rm -rf $diefile ; then
exit
fifi
done
else
wyzpput#這裡是在存在runfile的情況下試圖啟動該程序
oldpid=`cat $runfile`
newpid=`ps aux | grep "process.sh $1" | grep -v grep | grep "$oldpid" | awk ''`
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 '' | grep -v $$ | xargs --no-run-if-empty kill
if [ $? -eq 0 ]; then
rm -f $runfile
else
echo $?>$/data/error
程式設計客棧 fi
fifi只裡面有幾個要強調的地方:
我用這個shell去呼叫php程式,這個沒有侷限性,這裡要說明的是這種執行常駐程序的方法
在runfile存在,但程序號對不上殺程序時(也就是紅色額else所執行的地方),一定要 `grep -v $$`,作用是過濾掉當前執行的程序,要不然都被殺掉了,將後面的就不執行了
程式設計客棧還有乙個要注意的地方就是關於自動重啟了
自動重啟可以放在crontab中,每隔一段時間執行一次,具體情況具體對待。
複製** **如下:
crontab -e
#開啟當前使用者日程表,新增模式
#日程表中有5個星號,f1,f2,f3,f4,f5,
#其中f1表示分,f2表示時,f3表示日,f4表示月,f5表示乙個星期第幾天
#*表示www.cppcns.com每分/時/日/月/周天,*/n表示每n分/時/......執行一次
*/2 * * * * /root/test.sh
#沒2分鐘執行一次
這樣乙個完整的常駐程序功能就完成了,想要終止程序是只需要在對應的目錄下進行touch $即可。
本文標題: linux下的守護程序
本文位址: /os/linux/116350.html
linux下的守護程序
守護程序特點 1 生存期長,在系統自舉的時候啟動,僅在系統關閉時終止。2 沒有控制終端,所以說他們是在後台執行的。關於編寫守護程序程式時要遵守的一些基本規則 1 呼叫umask將檔案模式建立遮蔽字設定為0。防止由繼承得來的檔案模式建立遮蔽字可能會拒絕設定某些許可權 2 呼叫fork 然後使得父程序退...
Linux下守護程序的實現
一.fork 函式 通過系統呼叫建立乙個與原程序幾乎一模一樣的程序,可理解為轉殖了乙個自己。fork函式的返回值有下面幾種情況 1.在父程序中返回新建立子程序的的程序id 2.在子程序中返回0 3.呼叫失敗,返回負值 二.程序相關知識 1.程序組 乙個或者多個程序的集合。每個程序組擁有乙個程序組id...
linux下的守護(精靈)程序daemon
include include include include include include include include intmain else if pid 0 2.在子程序中建立新會話 setsid 3.改變當前目錄為根目錄 chdir 4.重設檔案許可權掩碼 umask 0 5.關閉檔...