2011-04-24 63 views
20

我不知道這是否是執行系統進程,並從母公司分離的正確途徑,但允許家長無需創建一個殭屍和/或殺死孩子退出處理。我目前使用的子模塊,做這個...Python的產卵關子子,分離,並退出

os.setsid() 
os.umask(0) 
p = subprocess.Popen(['nc', '-l', '8888'], 
        cwd=self.home, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

os.setsid()改變進程組,我相信這是什麼讓進程繼續運行時,它的父退出,因爲它不再屬於同一個進程組。

這是正確的,也是這是執行此的一個可靠的方法?

基本上,我有通過socket進行通信,並允許遠程啓動過程的遠程控制工具,但我要確保,如果遙控器模具,它啓動的進程繼續運行不受影響。

我在讀關於雙叉,不知道這是必要的和/或subprocess.POpen close_fds不知何故照顧,所需的一切是改變進程組?

謝謝。

伊利亞

+0

查看http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/ http://www.python.org/dev/peps/pep- 3143 /#reference-implementation – sehe 2011-04-24 20:11:24

回答

5

popen在Unix上是done using fork。這意味着你將會很安全:

  1. 你在你的父進程運行Popen當父進程退出,子進程是由init繼承
  2. 立即退出父進程

過程(launchd在OSX),並仍然會在後臺運行。

不需要你的Python程序的前兩行,這個完美的作品:

import os, time 
import subprocess 
p = subprocess.Popen(['nc', '-l', '8888'], 
        cwd="/", 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

我正在讀關於雙叉和不知道這是必要的

這如果你的父進程保持運行,你需要保護你的孩子與父臨終將需要。 This answer展示瞭如何可以做到這一點。

雙叉工作原理:Popen過程由init和運行繼承:

  1. 在這個孩子的呼叫Popen()這將啓動長時間運行的過程
  2. 出口孩子創造通過os.fork()
  3. 孩子在後臺

爲什麼父母必須立即退出?如果它不立即退出會發生什麼?

如果您讓父項繼續運行,並且用戶停止了該過程,例如()或ctrl-\SIGQUIT),那麼它會殺死父進程和進程。

如果在分叉後一秒退出會怎麼樣?

然後,在這1s期間你的Popen進程很容易受到ctrl-c等。如果你需要100%確定然後使用雙分叉。

+0

你能解釋爲什麼父母必須立即退出嗎?如果它不立即退出會發生什麼?還有什麼構成「立即」?如果分叉後一秒退出會怎麼樣? – Hubro 2017-01-23 10:08:26

+0

@Hubro:我已將上述問題的答案添加到上面的答案中,並澄清了一些很少解釋的內容 – hansaplast 2017-01-23 10:45:31

+0

如果子進程將大量輸出放入管道中,此進程將掛起。如果您不想與流程進行通信,請設置「stdout = None」。欲瞭解更多詳情,請參閱:https://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hinging-PIPE-is-your-enemy/ – 2018-03-08 08:51:09