Python subprocess.Popen如何终止带有子进程的进程?

5
如何向进程发送Ctrl-C或终止具有子进程的进程?
我的代码示例(Python 2.7):
# --*-- coding: utf-8 --*--
import subprocess
import os
import signal

proc = subprocess.Popen(['ping localhost'],shell=True,stdout=subprocess.PIPE)
print proc.pid

a = raw_input()
os.killpg(proc.pid, signal.SIGTERM)

当我运行程序时,我看到以下的流程:

user   16078  0.0  0.0   4476   916 pts/6    S+   14:41   0:00 /bin/sh -c ping localhost
user   16079  0.0  0.0   8628  1908 pts/6    S+   14:41   0:00 ping localhost

程序输出:

16078

输入之后:

Traceback (most recent call last):
  File "subproc2.py", line 10, in <module>
    os.killpg(proc.pid, signal.SIGTERM)
OSError: [Errno 3] No such process

我想杀死进程pid 16078和pid 16079。

我该如何做?程序中有什么错误吗?感谢您的帮助。

1个回答

6

我该怎么做?程序中的错误在哪里?

如果你想杀死包含在进程组中的所有进程,那么你应该使用父进程ID。像这样:

os.killpg(os.getpid(), signal.SIGTERM)

如果您只想结束一个子进程,请使用以下方法:
os.kill(proc.pid, signal.SIGTERM)

谢谢!错误已经消失,主进程“/bin/sh -c ping localhost”已被终止。但是“ping localhost”进程仍然存在。是否可能同时终止这两个进程? - Andrey Kucherenko
你的脚本经过我的更正后,只会生成一个“ping”进程,并且在程序结束时它将被终止。杀掉所有的ping进程并再次检查。 - Greg Eremeev
谢谢!代码“os.killpg(os.getpid(), signal.SIGTERM)”对我有用! - Andrey Kucherenko
然后选择我的回答作为解决方案并点赞。您也可以阅读https://en.wikipedia.org/wiki/Process_group。 - Greg Eremeev
这会终止所有子进程的实际Python进程,而不是仅终止具有子进程的子进程。 - Tibor Takács

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接