杀死使用 Python 的 subprocess.Popen() 创建的进程 [重复]

Posted

技术标签:

【中文标题】杀死使用 Python 的 subprocess.Popen() 创建的进程 [重复]【英文标题】:Killing a process created with Python's subprocess.Popen() [duplicate] 【发布时间】:2011-05-04 07:34:10 【问题描述】:

这是我的想法:

首先,我使用 subprocess.Popen 创建了一个进程

其次,经过一段时间后,我尝试通过 Popen.kill() 杀死它

import subprocess
import os, signal
import time

proc1 = subprocess.Popen("kvm -hda /path/xp.img", shell = True)
time.sleep(2.0)
print 'proc1 = ', proc1.pid
subprocess.Popen.kill(proc1)

但是,“proc1”在 Popen.kill() 之后仍然存在。 有高手能告诉我如何解决这个问题吗? 感谢您的考虑。

感谢所有专家的cmets,我按照你的建议做了,但结果还是一样。

proc1.kill() #it sill cannot kill the proc1

os.kill(proc1.pid, signal.SIGKILL) # either cannot kill the proc1

谢谢大家。

我还在等待您解决这个棘手问题的宝贵经验。

【问题讨论】:

为什么需要“shell = True”?如果没有这个,它似乎完全按照您的预期工作。 请不要将[已解决]放在标题中,而是点击复选符号选择正确答案。 正确答案在这里:***.com/questions/4789837/… subprocess.Popen.kill(proc)proc.kill() 完全相同。仅供参考。 kill -9 doesn't work 不太可能。您的问题可能是您需要kill the whole process tree。 【参考方案1】:

使用 os.kill 怎么样?在此处查看文档:http://docs.python.org/library/os.html#os.kill

【讨论】:

谢谢,但是 "os.kill(proc1.pid, signal.SIGTERM)" 或 "os.kill(proc1.pid, signal.SIGKILL)" 不起作用..【参考方案2】:

在你的代码中应该是

proc1.kill()

killterminate 都是 Popen object 的方法。在 macOS 和 Linux 上,kill 向进程发送信号 signal.SIGKILLterminate 发送 signal.SIGTERM。在 Windows 上,它们都调用 Windows 的 TerminateProcess() 函数。

【讨论】:

首先谢谢。不过这个我试过了,还是不行…… kill()terminate() 是不同的 kill 方法发送一个 SIGKILL 信号,其中 terminate 方法发送一个 SEGTERM 信号。不同之处在于前者从字面上终止进程,而后者仅停止进程。【参考方案3】:

只使用Popenkill方法

process = subprocess.Popen(
    task.getExecutable(), 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE, 
    shell=True
)
process.kill()

【讨论】:

这确实有效,直到我在“process.kill()”前面加上“time.sleep(x)”..【参考方案4】:

process.terminate() 在使用shell=True 时不起作用。这个answer 会帮助你。

【讨论】:

非常感谢,您的回答结束了我3小时的调试

以上是关于杀死使用 Python 的 subprocess.Popen() 创建的进程 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

当父进程死亡时,如何杀死使用 subprocess.check_output() 创建的 python 子进程?

Python:杀死一个张量流子进程

Python:当父进程死亡时如何杀死子进程?

当父母在python中崩溃时杀死子进程

如何使用python杀死资源消耗不变的Windows进程?

如何使用子进程模块杀死(或避免)僵尸进程