Python产生一个子subprocess,分离并退出

我想知道这是否是正确的方式来执行系统进程并从父母分离,但允许父母退出而不创build僵尸和/或杀死subprocess。 我目前正在使用的subprocess模块,这样做…

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

os.setsid()更改进程组,我相信这是进程在父进程退出时继续运行的原因,因为它不再属于同一个进程组。

这是正确的,这也是一个可靠的方式来执行此?

基本上,我有一个远程控制实用程序通过套接字进行通信,并允许远程启动进程,但是我必须确保,如果远程控制器死亡,它启动的进程继续运行不受影响。

我正在阅读有关双叉,不知道这是否是必要的和/或subprocess.POpen close_fds以某种方式照顾,所需的一切是改变进程组?

谢谢。

伊利亚

Unix上的popen是用fork完成的 。 这意味着你会安全的:

  1. 你在你的父进程中运行Popen
  2. 立即退出父进程

当父进程退出时,subprocess被init进程inheritance(在OSX上launchd ),并且仍然在后台运行。

你的Python程序的前两行是不需要的,这完美的工作:

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

我正在阅读有关双叉,不知道这是否是必要的

如果你的父母程序一直在运行,你需要保护你的孩子免受父母的死亡。 这个答案显示了如何做到这一点。

双叉如何工作:

  1. 通过os.fork()创build一个孩子
  2. 在这个小孩叫Popen()启动长时间运行的过程
  3. 退出subprocess: Popen进程由initinheritance并在后台运行

为什么父母必须立即退出? 如果不立即退出会发生什么?

如果你离开父进程,用户例如通过ctrl-CSIGINT )或ctrl-\SIGQUIT )来停止进程,那么它会同时杀死父进程和Popen进程。

如果分叉后一秒退出呢?

然后,在这个1s期间,你的Popen进程很容易受到ctrl-c等的影响。如果你需要100%确定,那么使用双分叉。