2016-07-25 140 views
0

當我在一個反向shell例子中偶然發現了daemonize()這個方法時,我環顧GitHub。 source這個守護進程方法做了什麼?

我不太明白是什麼它在這種情況下,不會在命令行中運行該代碼,例如:python example.py &不能達到同樣的事情?

Deamonize方法來源:

def daemonize(): 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit first parent 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit second parent 
+1

請參閱[將程序作爲守護程序運行並將它與'&'分隔爲背景有什麼區別?](http://unix.stackexchange.com/questions/56495/whats-the-difference-between-running -a-節目作爲一種後臺程序和 - 分岔 - 它-成) –

回答

1

後臺進程 - 運行python2.7 <file>.py&信號 - 與真守護進程不同。

真正的守護進程:

  • 在後臺運行。如果您使用&,並且是相似性結束的位置,也會發生這種情況。
  • 與終端不在同一個進程組中。當終端關閉時,守護進程也不會死機。這不會發生在& - 過程保持不變,它只是移動到後臺。
  • 正確關閉所有繼承的文件描述符(包括輸入,輸出等),以便沒有任何東西將其綁定回父文件夾。再次,這不會發生在& - 它仍會寫入終端。
  • 只能理想地被SIGKILL殺死,而不是SIGHUP。用&運行可以讓你的進程被SIGHUP殺死。

所有這一切,但是,是迂腐。很少有任務真的需要你去這些屬性需要的極端 - 在一個使用screen的新終端中產生的後臺任務通常可以完成相同的工作,儘管效率較低,並且你可以稱之爲守護進程,因爲它是一個長時間運行的後臺任務。 和一個真正的守護進程之間的唯一真正區別是後者只是試圖避免所有潛在的死亡途徑。

您看到的代碼只是簡化了當前進程。本質上,它克隆當前進程,通過簡單地阻止當前執行的單獨進程來殺死其父進程並「在後臺執行」 - 如果你問我,它會起作用,這有點醜陋。

1

看一看Orphan ProcessesDaemon Process。沒有父進程的進程成爲init的子進程(pid 1)。

當需要關閉一組進程時,說出一個bash實例的所有孩子,操作系統將會對該bash的孩子發出一聲嘆息。一個孤兒,在這種情況下被迫,或者由於某種意外而被迫,不會得到那種治療,並且會停留更長時間。