【发布时间】:2018-02-13 09:25:34
【问题描述】:
我正在 python 中使用 subprocess 模块运行一些 shell 脚本。如果 shell 脚本运行时间过长,我喜欢终止子进程。我认为如果我将timeout=30 传递给我的run(..) 语句就足够了。
代码如下:
try:
result=run(['utilities/shell_scripts/{0} {1} {2}'.format(
self.language_conf[key][1], self.proc_dir, config.main_file)],
shell=True,
check=True,
stdout=PIPE,
stderr=PIPE,
universal_newlines=True,
timeout=30,
bufsize=100)
except TimeoutExpired as timeout:
我已经用一些运行 120 秒的 shell 脚本测试了这个调用。我预计子进程将在 30 秒后被杀死,但实际上该进程正在完成 120 秒脚本并且引发超时异常。现在的问题是如何通过超时杀死子进程?
【问题讨论】:
-
您是否尝试过使用
Popen的旧方法? -
您的
except块中有什么?来自文档:“如果超时到期,子进程不会被杀死,因此为了正确清理,行为良好的应用程序应该杀死子进程并完成通信” -
我看过官方文档,它发送
SIGKILL杀死子进程。也许你的脚本不能被SIGKILL杀死?在原始终端中尝试一下。 -
@cdarke 这是
Popen的行为,但不是run。run将杀死子进程。 -
@Sraw:对不起,你是对的。不过,我仍然想知道
except块中的内容。
标签: python subprocess