【问题标题】:Killing children of children in python with subprocess用子进程在python中杀死孩子的孩子
【发布时间】:2012-02-25 09:59:54
【问题描述】:

python 是否提供了一种方法来查找使用子进程生成的子进程的子进程,以便我可以正确地杀死它们?如果没有,有什么好的方法可以确保孩子的孩子被杀死?

【问题讨论】:

  • 与此不完全重复(因为它只是说不要调用 shell。我正在寻找一种方法来获取生成的子进程的子进程,python 生成的进程已经被直接调用) : stackoverflow.com/questions/2638909/…

标签: python subprocess kill


【解决方案1】:

不太容易,但如果您的应用程序在 Linux 中运行,您可以遍历 /proc 文件系统并构建一个 PPID(父 PID)与您的子进程相同的所有 PID 的列表。

【讨论】:

  • 叹息。所以我认为答案实际上是否定的。谢谢你。我会看看我是否可以避免子进程产生(或让它们自动被杀死)。
【解决方案2】:

以下内容仅适用于 Unix:

在子进程中调用os.setsid() 将使其成为新会话的会话领导者和新process group 的进程组领导者。向进程组发送 SIGTERM 将向该子进程可能产生的所有子进程发送 SIGTERM。

您可以使用subprocess.Popen(..., preexec_fn=os.setsid) 执行此操作。例如:

import signal
import os
import subprocess
import time
PIPE = subprocess.PIPE
proc = subprocess.Popen('ls -laR /', shell=True,
                        preexec_fn=os.setsid,
                        stdout=PIPE, stderr=PIPE)
time.sleep(2)
os.killpg(proc.pid, signal.SIGTERM)

运行它不会显示任何输出,但ps ax 将显示子进程,并且它产生的ls -laR 将被终止。

但是如果你注释掉

preexec_fn=os.setsid

然后ps ax 会显示类似

% ps ax | grep "ls -la"
 5409 pts/3    S      0:00 /bin/sh -c ls -laR /
 5410 pts/3    R      0:05 ls -laR /

所以没有os.setsidls -laR 和生成它的shell 仍然在运行。一定要杀死他们:

% kill 5409
% kill 5410

【讨论】:

  • 谢谢,这对我杀死产生自己的进程的子进程有很大帮​​助。
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2020-08-07
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多