Python派生子进程、分离和exi

2024-05-18 10:08:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道这是否是执行系统进程并与父进程分离的正确方法,尽管允许父进程退出而不创建僵尸和/或杀死子进程。我正在使用子流程模块并执行此操作。。。

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

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

这是正确的吗?这也是一种可靠的执行方式吗?

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

我在读关于double forks的文章,不确定这是否是必要的和/或子流程。POpen close_fds不知怎么解决了这个问题,所需要的只是更改流程组?

谢谢。

伊利亚


Tags: 模块方法self远程进程os系统流程
1条回答
网友
1楼 · 发布于 2024-05-18 10:08:41

Unix上的popendone using ^{}。这意味着你可以安全地:

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

当父进程退出时,子进程由init进程(OSX上的launchd)继承,并且仍将在后台运行。

不需要python程序的前两行代码,这非常有效:

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

I was reading about double-forks and not sure if this is necessary

如果您的父进程继续运行,并且您需要保护您的孩子不与父进程一起死亡,则需要这样做。This answer显示了如何实现这一点。

双叉的工作原理:

  1. 通过os.fork()创建子级
  2. 在这个启动长时间运行进程的子调用Popen()
  3. 退出子进程:Popen进程由init继承并在后台运行

Why the parent has to immediately exit? What happens if it doesn't exit immediately?

如果让父进程继续运行,并且用户停止进程,例如通过ctrl-CSIGINT)或ctrl-\SIGQUIT),那么它将杀死父进程和Popen进程。

What if it exits one second after forking?

然后,在这1s期间,您的Popen进程易受ctrl-c等攻击。如果您需要100%确定,则使用双分叉。

相关问题 更多 >