gpt4 book ai didi

Python 生成子子进程、分离和退出

转载 作者:IT老高 更新时间:2023-10-28 22:23:04 31 4
gpt4 key购买 nike

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

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

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

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

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

我正在阅读有关双 fork 的信息,但不确定这是否有必要和/或 subprocess.POpen close_fds 以某种方式解决了这个问题,而所需要做的就是更改进程组?

谢谢。

伊利亚

最佳答案

popen 在 Unix 上是 done using fork .这意味着您可以放心:

  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

如果您的父进程继续运行并且您需要保护您的 child 免于与父进程一起死亡,则需要这样做。 This answer展示了如何做到这一点。

双叉的工作原理:

  1. 通过 os.fork()
  2. 创建一个子节点
  3. 在这个子调用中 Popen() 启动长时间运行的进程
  4. exit child:Popen进程被init继承,在后台运行

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

如果您让父进程运行并且用户停止进程,例如通过 ctrl-C (SIGINT) 或 ctrl-\ (SIGQUIT) 然后它会杀死两个父进程和 Popen 进程。

What if it exits one second after forking?

然后,在这 1 秒期间,您的 Popen 进程容易受到 ctrl-c 等攻击。如果您需要 100% 确定,请使用双 fork 。

关于Python 生成子子进程、分离和退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772873/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com