2010-11-16 75 views
17

我知道一些(所有?)守護進程在啓動時分叉。我的印象是,將子進程作爲權限較低的用戶運行,特別是如果守護進程類似於HTTP服務器。爲什麼守靈分叉?

爲什麼這是必要的?無法啓動進程並放棄其權限而不分發子進程?分叉是否爲「強制」,還是有其他特殊原因(除了運行多個子工作者進程之外)?

我是新來的,希望能得到所有的幫助。

回答

19

我想守護叉有以下幾個原因:

  1. 一個原因是從啓動它任何外殼拆卸處理。有些炮彈(例如Bash)會在退出時殺死兒童,除非特殊的,特定的炮彈預防措施。分叉是避免這種情況的通用方法。

  2. 另一個原因是報告守護進程已成功啓動

    假設它不分叉。你怎麼知道守護進程已經成功啓動?你不能只讀取和解析守護進程輸出,因爲守護進程管理程序應該以通用的方式進行。所以唯一的方法是獲得程序的返回碼。實際上,如果一個守護進程無法啓動(例如,它找不到配置文件),那麼您會立即知道這一點。但是,嘿,如果守護進程已經成功啓動,它可能永遠不會返回!因此,守護進程管理器無法知道守護進程是否仍在嘗試啓動,或者已經啓動,並且正在運行。叉會解決這個問題,如果分叉運行良好,分叉程序將返回成功。

  3. 至於特權,投下他們execve比以前execve這樣做安全得多。這是叉子方便的另一個原因。

3

我的印象是,這樣做是爲了讓守護進程完全獨立於任何其他進程(如shell或類似進程)。通過分離和退出父進程,孤立進程將被系統init進程「採用」。

3

要備份什麼daramarak說,從Wikipedia's article

在Unix環境下,守護進程的父 過程中往往(但不 總是)init進程(PID = 1 )。 過程通常成爲 守護程序派生一個子進程,然後 有他們的父進程 立即退出,從而導致初始化到 採用子進程。這是 過程的某種程度的簡化視圖,因爲其他操作通常執行的是 ,例如 將守護進程與 任意控制的tty解離。便利 例如守護進程(3)存在於 爲此目的的一些UNIX系統。

基本上這個過程需要與其他進程和終端等分離。

+0

感謝你的支持:) – daramarak 2010-11-16 09:17:29

7

守護進程必須叉兩次,因爲它們必須indipendent其他進程,這是沒有辦法殺守護殺死另一個進程,並且必須在後臺運行,未連接到終端。

啓動時,守護進程分支和父進程死亡。這使分叉進程成爲init的子進程,因此基本上與其他進程無關。

在第二個叉子上,孩子不再是過程領導者,而是從終端分離。

其他的良好做法可能適用,閱讀一個簡單的守護進程的源代碼可能是有見識的。

+2

任何建議一個精心編寫的簡單守護進程grok?我敢打賭,有一些可以避免... – 2010-11-16 09:39:38

+0

這個答案一定是被接受的,因爲它解釋了雙分叉,這對於守護進程來說是一個非常重要的概念。 – th3an0maly 2016-03-09 17:21:14