我想杀死整个进程树.使用任何常用脚本语言执行此操作的最佳方法是什么?我正在寻找一个简单的解决方案.
假设我有一个只产生一个子进程的进程.现在,当父进程因任何原因(正常或异常,通过kill,^ C,断言失败或其他任何原因)退出时,我希望子进程死掉.如何正确地做到这一点?
stackoverflow上的一些类似问题:
关于Windows的 stackoverflow的一些类似问题:
子进程以#开头
subprocess.Popen(arg)
如果父母异常终止,有没有办法确保它被杀死?我需要这个在Windows和Linux上都可以工作.我知道这个Linux解决方案.
编辑:
subprocess.Popen(arg)如果使用不同的启动流程的方法存在解决方案,则可以放宽启动子流程的要求.
我正在尝试编写一个python程序来测试用C编写的服务器.python程序使用subprocess模块启动已编译的服务器:
pid = subprocess.Popen(args.server_file_path).pid
这工作正常,但是如果python程序由于错误而意外终止,则生成的进程将保持运行状态.我需要一种方法来确保如果python程序意外退出,服务器进程也会被终止.
更多细节:
如何Queue.get()在Python 3.X中中断阻塞?
在Python 2.X 设置中,长时间的超时似乎有效,但对于Python 3.5来说也是如此.
在Windows 7,CPython 3.5.1,64位机器和Python上运行.看起来它在Ubuntu上的行为并不相同.
确保子进程在父进程终止时终止是很棘手的。我在 Linux 中从 Python 中找到了一个强大的解决方案,即当父进程使用prctl(PR_SET_PDEATHSIG, SIGTERM). 考虑到prctl()来自 C 标准库,C 或 C++ 可能也是如此。
关于如何在 Java 中杀死子进程有几个问题,参见例如[1]。但是,我发现没有什么比使用prctl(). 如果父级收到 SIGKILL,或者他们需要修改子级代码,大多数解决方案都会失败。通过让操作系统为我们完成这项工作,无论父级发生什么,子级总是会被成功杀死,并且子级代码不需要修改。
如何调用prctl(PR_SET_PDEATHSIG, SIGTERM)从 Java ProcessBuilder 产生的子进程?
如何获取我没有为其创建对象的子进程的pid?即
myProc = Popen(["sleep","30"])
VS
Popen(["sleep","30"])
我注意到,如果我在发送终止信号后没有轮询()或等待(),它们就变成了僵尸进程.在我的脚本中的某个点上,我想找到我的脚本是其父项的所有子进程,并向它们发送信号或轮询它们.这在python中可能吗?有可能吗?