2011-04-24 68 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