中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

使用PHP腳本來寫Daemon程序
來源:易賢網 閱讀:946 次 日期:2014-09-18 11:20:54
溫馨提示:易賢網小編為您整理了“使用PHP腳本來寫Daemon程序”,方便廣大網友查閱!

什么是Daemon進程

這又是一個有趣的概念,daemon在英語中是"精靈"的意思,就像我們經常在迪斯尼動畫里見到的那些,有些會飛,有些不會,經常圍著動畫片的主人公轉來轉去,啰里啰唆地提一些忠告,時不時倒霉地撞在柱子上,有時候還會想出一些小小的花招,把主人公從敵人手中救出來,正因如此,daemon有時也被譯作"守護神"。所以,daemon進程在國內也有兩種譯法,有些人譯作"精靈進程",有些人譯作"守護進程",這兩種稱呼的出現頻率都很高。

與真正的daemon相似,daemon進程也習慣于把自己隱藏在人們的視線之外,默默為系統做出貢獻,有時人們也把它們稱作"后臺服務進程"。daemon進程的壽命很長,一般來說,從它們一被執行開始,直到整個系統關閉,它們才會退出。幾乎所有的服務器程序,包括我們熟知的Apache和wu-FTP,都用daemon進程的形式實現。很多Linux下常見的命令如inetd和ftpd,末尾的字母d就是指daemon。

為什么一定要使用daemon進程呢?Linux中每一個系統與用戶進行交流的界面稱為終端(terminal),每一個從此終端開始運行的進程都會依附于這個終端,這個終端就稱為這些進程的控制終端(Controlling terminal),當控制終端被關閉時,相應的進程都會被自動關閉。關于這點,讀者可以用X-Window中的XTerm試驗一下,(每一個XTerm就是一個打開的終端,)我們可以通過鍵入命令啟動應用程序,比如:$netscape 然后我們關閉XTerm窗口,剛剛啟動的netscape窗口也會隨之一同突然蒸發。但是daemon進程卻能夠突破這種限制,即使對應的終端關閉,它也能在系統中長久地存在下去,如果我們想讓某個進程長命百歲,不因為用戶或終端或其他的變化而受到影響,就必須把這個進程變成一個daemon進程。

Daemon進程的編程規則

如果想把自己的進程變成daemon進程,我們必須嚴格按照以下步驟進行:

1、調用fork產生一個子進程,同時父進程退出。我們所有后續工作都在子進程中完成。這樣做我們可以:

1.1 如果我們是從命令行執行的該程序,這可以造成程序執行完畢的假象,shell會回去等待下一條命令;

1.2 剛剛通過fork產生的新進程一定不會是一個進程組的組長,這為第2步的執行提供了前提保障。

這樣做還會出現一種很有趣的現象:由于父進程已經先于子進程退出,會造成子進程沒有父進程,變成一個孤兒進程(orphan)。每當系統發現一個孤兒進程,就會自動由1號進程收養它,這樣,原先的子進程就會變成1號進程的子進程。

2、調用setsid系統調用。這是整個過程中最重要的一步。setsid的介紹見附錄2,它的作用是創建一個新的會話(session),并自任該會話的組長(session leader)。如果調用進程是一個進程組的組長,調用就會失敗,但這已經在第1步得到了保證。調用setsid有3個作用:

2.1 讓進程擺脫原會話的控制;

2.2 讓進程擺脫原進程組的控制;

2.3 讓進程擺脫原控制終端的控制;

總之,就是讓調用進程完全獨立出來,脫離所有其他進程的控制。

3、把當前工作目錄切換到根目錄。

如果我們是在一個臨時加載的文件系統上執行這個進程的,比如:/mnt/floppy/,該進程的當前工作目錄就會是/mnt/floppy/。在整個進程運行期間該文件系統都無法被卸下(umount),而無論我們是否在使用這個文件系統,這會給我們帶來很多不便。解決的方法是使用chdir系統調用把當前工作目錄變為根目錄,應該不會有人想把根目錄卸下吧。

關于chdir的用法,參見附錄1。

當然,在這一步里,如果有特殊的需要,我們也可以把當前工作目錄換成其他的路徑,比如/tmp。

4、將文件權限掩碼設為0。

這需要調用系統調用umask,參見附錄3。每個進程都會從父進程那里繼承一個文件權限掩碼,當創建新文件時,這個掩碼被用于設定文件的默認訪問權限,屏蔽掉某些權限,如一般用戶的寫權限。當另一個進程用exec調用我們編寫的daemon程序時,由于我們不知道那個進程的文件權限掩碼是什么,這樣在我們創建新文件時,就會帶來一些麻煩。所以,我們應該重新設置文件權限掩碼,我們可以設成任何我們想要的值,但一般情況下,大家都把它設為0,這樣,它就不會屏蔽用戶的任何操作。

如果你的應用程序根本就不涉及創建新文件或是文件訪問權限的設定,你也完全可以把文件權限掩碼一腳踢開,跳過這一步。

5、關閉所有不需要的文件。

同文件權限掩碼一樣,我們的新進程會從父進程那里繼承一些已經打開了的文件。這些被打開的文件可能永遠不被我們的daemon進程讀或寫,但它們一樣消耗系統資源,而且可能導致所在的文件系統無法卸下。需要指出的是,文件描述符為0、1和2的三個文件(文件描述符的概念將在下一章介紹),也就是我們常說的輸入、輸出和報錯這三個文件也需要被關閉。很可能不少讀者會對此感到奇怪,難道我們不需要輸入輸出嗎?但事實是,在上面的第2步后,我們的daemon進程已經與所屬的控制終端失去了聯系,我們從終端輸入的字符不可能達到daemon進程,daemon進程用常規的方法(如printf)輸出的字符也不可能在我們的終端上顯示出來。所以這三個文件已經失去了存在的價值,也應該被關閉。

使用PHP編寫Gearman的Worker守護進程

在我之前的文章中,介紹過Gearman的使用。在我的項目中,我使用了PHP來編寫一直運行的Worker。如果按照Gearman官方推薦的例子,只是簡單的一個循環來等待任務,會有一些問題,包括:1、當代碼進行過修改之后,如何讓代碼的修改生效;2、重啟Worker的時候,如何保證當前的任務處理完成才重啟。

針對這個問題,我考慮了以下的解決方法:

1、每次修改完代碼后,Worker需要手工重啟(先殺死然后啟動)。這個只能解決重新加載配置文件的問題。

2、在Worker中設置,單次任務循環完成后,就對Worker進行重啟。這個方案的問題在于消耗比較大。

3、在Worker中添加一個退出函數,如果需要Worker退出的時候,在Client端發送一個優先級比較高的退出調用。這個需要客戶端配合,在使用后臺類任務時,不太適合。

4、在Worker中檢查文件是否發生變化,如果發生了變化,退出并重啟自身。

5、為Worker編寫信號控制,接受重啟指令,類似于 http restart graceful 指令。

最后,結合4和5兩種方法,可以實現這樣一個Daemon,如果配置文件發生了變化,他就會自動重啟;如果接受到了用戶的 kill -1 pid 信號,也會重新啟動。

代碼如下:

Copy to Clipboard

declare( ticks = 1 );

// This case will check the config file regularly, if the config file changed, it will restart it self

// If you want to restart the daemon gracefully, give it a HUP signal

// by shiqiang at 2011-12-04

$init_md5 = md5_file( 'config.php');

// register signal handler

pcntl_signal( SIGALRM, "signal_handler", true );

pcntl_signal( SIGHUP, 'signal_handler', TRUE );

$job_flag = FALSE; //Job status flag, to justify if the job has been finished

$signal_flag = FALSE; //Signal status flag, to justify whether we received the kill -1 signal

while( 1 ){

$job_flag = FALSE; //Job status flag

print "Worker start running ... n";

sleep(5);

print "Worker's task done ... n";

$flag = TRUE; //Job status flag

AutoStart( $signal_flag );

}

function signal_handler( $signal ) {

global $job_flag;

global $signal_flag;

switch( $signal ){

case SIGQUIT:

print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGQUIT - No : $signal n";

exit(0);

break;

case SIGSTOP:

print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGSTOP - No : $signal n";

break;

case SIGHUP:

print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGHUP - No : $signal n";

if( $flag === TRUE ){

AutoStart( TRUE );

}else{

$signal_flag = TRUE;

}

break;

case SIGALRM:

print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGALRM - No : $signal n";

//pcntl_exec( '/bin/ls' );

pcntl_alarm( 5 );

break;

default:

break;

}

}

function AutoStart( $signal = FALSE, $filename = 'config.php' ){

global $init_md5;

if( $signal || md5_file( $filename ) != $init_md5 ){

print "The config file has been changed, we are going to restart. n";

$pid = pcntl_fork();

if( $pid == -1 ){

print "Fork error n";

}else if( $pid > 0 ){

print "Parent exit n";

exit(0);

}else{

$init_md5 = md5_file( $filename );

print "Child continue to run n";

}

}

}

更多信息請查看IT技術專欄

更多信息請查看網絡編程
易賢網手機網站地址:使用PHP腳本來寫Daemon程序
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久久久天天天天| 国产精品久久久久久亚洲毛片 | 欧美在线视频网站| 国产精品主播| 日韩一级成人av| 国产精品久久久久一区| 欧美尤物巨大精品爽| 国内精品模特av私拍在线观看 | 国内精品久久久久久| 欧美中文在线免费| 在线观看日韩www视频免费 | 欧美在线首页| 91久久综合亚洲鲁鲁五月天| 欧美日韩精品| 久久蜜臀精品av| 午夜日韩福利| 日韩亚洲欧美高清| 国产在线播精品第三| 欧美日韩中文字幕在线视频| 久久裸体艺术| 久久久噜噜噜久久| 午夜一区二区三区在线观看 | 国产精品黄页免费高清在线观看| 性欧美8khd高清极品| 一区二区三区回区在观看免费视频| 国产真实乱偷精品视频免| 国产精品久久久久久五月尺| 欧美日韩另类丝袜其他| 免费亚洲视频| 欧美—级a级欧美特级ar全黄| 久久亚洲综合网| 欧美aaaaaaaa牛牛影院| 欧美电影在线| 欧美视频在线观看 亚洲欧| 欧美极品一区| 国产精品视频专区| 国产一区二区三区久久精品| 国产亚洲精品bt天堂精选| 国模私拍一区二区三区| 亚洲成人在线免费| 亚洲免费观看高清在线观看 | 国产精品入口日韩视频大尺度| 欧美日韩另类国产亚洲欧美一级| 欧美巨乳在线观看| 国产精品久久国产三级国电话系列| 欧美日一区二区在线观看 | 亚洲影音先锋| 欧美在线视频免费播放| 久久久久久夜| 欧美日韩精品一区| 国产美女诱惑一区二区| 国产午夜精品一区理论片飘花 | 免费视频一区| 欧美aa在线视频| 欧美极品在线观看| 国产精品一区2区| 一区二区三区在线观看国产| 国产欧美日韩一区二区三区在线观看 | 欧美精品123区| 国产在线视频欧美| 亚洲视频一区二区在线观看 | 欧美日韩第一区| 国内精品久久久久久久影视蜜臀| 亚洲经典自拍| 麻豆精品网站| 亚洲人成在线播放| 久久青青草综合| 国产一区二区三区不卡在线观看| 亚洲第一区在线| 久久资源av| 在线观看国产成人av片| 久久久久亚洲综合| 伊人蜜桃色噜噜激情综合| 久久国产天堂福利天堂| 黑人巨大精品欧美一区二区小视频| 欧美在线视频全部完| 韩国精品久久久999| 久久免费视频网站| 亚洲欧洲日韩在线| 国产精品豆花视频| 久久国产精品高清| 亚洲激情影院| 国产欧美日韩精品一区 | 伊人久久婷婷| 欧美成年人网| 香港成人在线视频| 亚洲精品视频在线播放| 国产性色一区二区| 欧美日韩一区视频| 久久人人爽人人爽| 午夜老司机精品| 99亚洲精品| 亚洲精品偷拍| 亚洲高清资源综合久久精品| 国产精品久久久免费| 欧美华人在线视频| 久久夜色精品一区| 久久久久久91香蕉国产| 亚洲欧美日韩另类| 亚洲一区999| 亚洲小说欧美另类婷婷| 亚洲破处大片| 亚洲人成亚洲人成在线观看图片 | 欧美不卡激情三级在线观看| 一区二区三区免费观看| 亚洲成人自拍视频| 在线不卡中文字幕| 亚洲激情av在线| 亚洲国产高潮在线观看| 国产视频久久网| 韩日欧美一区二区| 亚洲电影免费观看高清完整版在线观看 | 欧美成人精品不卡视频在线观看| 亚洲香蕉在线观看| 性色av一区二区三区在线观看| 亚洲一级网站| 欧美一区二区视频观看视频| 亚洲欧美偷拍卡通变态| 久久久久综合网| 欧美黄色免费网站| 国产精品一区二区你懂得| 国产精品私房写真福利视频 | 亚洲免费观看高清在线观看 | 欧美日韩一区二区免费在线观看| 欧美日韩国产在线看| 欧美日韩少妇| 极品av少妇一区二区| 99热精品在线观看| 久久免费的精品国产v∧| 久久久久青草大香线综合精品| 久久精品国产第一区二区三区最新章节| 亚洲视频欧美视频| 欧美精品国产精品日韩精品| 免费日韩一区二区| 国产精品久久久一区二区三区| 国产日本欧美一区二区三区在线 | 欧美日韩不卡一区| 国产一区二区黄| 亚洲少妇最新在线视频| 亚洲一区二区三区四区五区黄| 性做久久久久久久久| 欧美人与性动交cc0o| 一区二区亚洲精品| 午夜日韩在线| 国产精品久久久久久久第一福利| 一区精品久久| 欧美在线日韩| 国产香蕉97碰碰久久人人| 一区二区三区四区五区精品视频| 男人插女人欧美| 国产视频一区二区在线观看 | 久久综合久久综合九色| 欧美日韩高清在线| 亚洲裸体在线观看| 欧美精品偷拍| 亚洲一级影院| 国产一区视频观看| 免费精品视频| 亚洲综合不卡| 亚洲电影在线播放| 国产精品成人免费精品自在线观看| 一区二区三区精品在线| 国产专区欧美精品| 欧美日韩三区| 你懂的视频一区二区| 亚洲永久网站| 亚洲精品乱码久久久久久黑人| 国产精品日韩| 欧美日韩一区在线播放| 香蕉久久一区二区不卡无毒影院 | 欧美金8天国| 日韩视频在线观看免费| 国产精品久久看| 欧美va亚洲va日韩∨a综合色| 亚洲成人在线视频网站| 欧美体内she精视频| 久久久噜噜噜久噜久久| 一本色道久久综合狠狠躁篇的优点 | 国产精品女主播| 久久中文字幕导航| 亚洲永久免费精品| 在线观看日韩| 有坂深雪在线一区| 国产精品一区二区三区久久久 | 亚洲欧美成人一区二区在线电影| 国际精品欧美精品| 国产精品xvideos88| 久热爱精品视频线路一| 夜夜嗨av一区二区三区网页| 国产综合久久| 国产日韩欧美中文在线播放| 国产精品久久久久久久久动漫| 美女免费视频一区| 欧美在线日韩精品| 久久影视三级福利片| 欧美黄色影院| 国产精品麻豆va在线播放| 国产精品系列在线播放| 精品成人在线观看| 一区二区三区国产盗摄|