Kill a running subprocess call
我正在Python上用
在某些情况下,程序可能会冻结。 这是我无法控制的。 我从命令行启动的唯一办法是CtrlEsc,它可以快速杀死程序。
有没有办法用
好吧,
例如...
1 2 3 4 5 6 | import subprocess import time process = subprocess.Popen(cmd, shell=True) time.sleep(5) process.terminate() |
...将在五秒钟后终止该过程。
或者您可以使用
1 2 3 4 5 6 7 8 | import subprocess import time import os import signal process = subprocess.Popen(cmd, shell=True) time.sleep(5) os.kill(process.pid, signal.SIGINT) |
1 2 | p = subprocess.Popen("echo 'foo' && sleep 60 && echo 'bar'", shell=True) p.kill() |
查看
你的问题不太清楚,但如果我假设你即将启动一个进入僵尸的进程,你希望能够在你的脚本的某些状态下控制它。如果在这种情况下,我建议你以下:
1 | p = subprocess.Popen([cmd_list], shell=False) |
这并不是真的要求通过shell。
我建议你使用shell = False,这样你就可以减少溢出的风险。
1 2 3 4 5 6 7 8 9 10 11 | # 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" |
您可以使用两个信号来终止正在运行的子进程调用,即signal.SIGTERM和signal.SIGKILL;例如
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) |