我正在Python上发布一个subprocess
的程序。
在某些情况下,程序可能会冻结。这是我无法控制的。我可以从命令行执行的唯一操作是 Ctrl Esc ,它会快速杀死程序。
有没有办法用subprocess
来模仿这个?我正在使用subprocess.Popen(cmd, shell=True)
启动该程序。
答案 0 :(得分:22)
嗯,subprocess.Popen()
返回的对象有两种方法可能有用:Popen.terminate()
和Popen.kill()
,它们发送SIGTERM
和{{ 1}}分别。
例如......
SIGKILL
...将在五秒钟后终止该过程。
或者您可以使用os.kill()
发送其他信号,例如import subprocess
import time
process = subprocess.Popen(cmd, shell=True)
time.sleep(5)
process.terminate()
以模拟CTRL-C,...
SIGINT
答案 1 :(得分:16)
p = subprocess.Popen("echo 'foo' && sleep 60 && echo 'bar'", shell=True)
p.kill()
查看subprocess
模块上的文档了解详情:http://docs.python.org/2/library/subprocess.html
答案 2 :(得分:1)
你的问题不太清楚,但如果我假设你即将启动一个进入僵尸的进程,你希望能够在你的脚本的某些状态下控制它。如果在这种情况下,我建议你:
p = subprocess.Popen([cmd_list], shell=False)
这并不是真的要求通过shell。 我建议你使用shell = False,这样你就可以减少溢出的风险。
# Get the process id & try to terminate it gracefuly
pid = p.pid
p.terminate()
# Check if the process has really terminated & force kill if not.
try:
os.kill(pid, 0)
p.kill()
print "Forced kill"
except OSError, e:
print "Terminated gracefully"
答案 3 :(得分:0)
您可以使用两个信号来终止正在运行的子进程调用,即signal.SIGTERM和signal.SIGKILL;例如
import subprocess
import os
import signal
import time
..
process = subprocess.Popen(..)
..
# killing all processes in the group
os.killpg(process.pid, signal.SIGTERM)
time.sleep(2)
if process.poll() is None: # Force kill if process is still alive
time.sleep(3)
os.killpg(process.pid, signal.SIGKILL)
答案 4 :(得分:0)
尝试将您的subprocess.Popen调用包装在try除了块中。根据挂起进程的原因,您可能可以干净地退出。以下是您可以检查的异常列表:Python 3 - Exceptions Handling