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
完成的 。 这意味着你会安全的:
- 你在你的父进程中运行
Popen
- 立即退出父进程
当父进程退出时,subprocess被init
进程inheritance(在OSX上launchd
),并且仍然在后台运行。
你的Python程序的前两行是不需要的,这完美的工作:
import os, time import subprocess p = subprocess.Popen(['nc', '-l', '8888'], cwd="/", stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
我正在阅读有关双叉,不知道这是否是必要的
如果你的父母程序一直在运行,你需要保护你的孩子免受父母的死亡。 这个答案显示了如何做到这一点。
双叉如何工作:
- 通过
os.fork()
创build一个孩子 - 在这个小孩叫
Popen()
启动长时间运行的过程 - 退出subprocess:
Popen
进程由init
inheritance并在后台运行
为什么父母必须立即退出? 如果不立即退出会发生什么?
如果你离开父进程,用户例如通过ctrl-C
( SIGINT
)或ctrl-\
( SIGQUIT
)来停止进程,那么它会同时杀死父进程和Popen
进程。
如果分叉后一秒退出呢?
然后,在这个1s期间,你的Popen
进程很容易受到ctrl-c等的影响。如果你需要100%确定,那么使用双分叉。