杀死使用 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()
kill
或 terminate
都是 Popen
object 的方法。在 macOS 和 Linux 上,kill
向进程发送信号 signal.SIGKILL
,terminate
发送 signal.SIGTERM
。在 Windows 上,它们都调用 Windows 的 TerminateProcess()
函数。
【讨论】:
首先谢谢。不过这个我试过了,还是不行……kill()
和 terminate()
是不同的 kill 方法发送一个 SIGKILL 信号,其中 terminate 方法发送一个 SEGTERM 信号。不同之处在于前者从字面上终止进程,而后者仅停止进程。【参考方案3】:
只使用Popen
kill方法
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() 创建的进程 [重复]的主要内容,如果未能解决你的问题,请参考以下文章