用子进程杀死python中的子进程

时间:2012-02-02 18:09:40

标签: python subprocess kill

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

2 个答案:

答案 0 :(得分:3)

以下仅适用于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

答案 1 :(得分:1)

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