【问题标题】:python subprocess.Popen kill process with child processespython subprocess.Popen 杀死带有子进程的进程
【发布时间】:2017-07-27 16:35:03
【问题描述】:

如何发送 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

raw_input 之后:

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。

我将如何做到这一点以及程序中的错误是什么?感谢您的帮助。

【问题讨论】:

    标签: python subprocess kill-process


    【解决方案1】:

    我将如何做到这一点以及程序中的错误是什么?

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

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

    如果你只想杀死一个子进程,那么使用这个:

    os.kill(proc.pid, signal.SIGTERM)
    

    【讨论】:

    • 谢谢!错误消失了,主进程“/bin/sh -c ping localhost”被杀死。但是“ping localhost”过程仍然存在。是否有可能杀死两个进程?
    • 您的脚本经过我的更正只会产生一个“ping”进程,并且在程序结束时它将被杀死。终止所有 ping 进程并再次检查。
    • 谢谢!代码 "os.killpg(os.getpid(), signal.SIGTERM)" 为我工作!
    • 然后选择我的答案作为解决方案并投票。你也可以阅读en.wikipedia.org/wiki/Process_group
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多