【发布时间】:2020-10-21 14:14:35
【问题描述】:
我不打算详细说明为什么我需要这样做,但我的问题如下:我有一个包含一些我需要运行的 shell 命令的字符串,它可能有其中的一些输出重定向。考虑一个简单的例子:
cmd = "yes > output.txt"
我希望能够在超时的情况下通过 python 运行此命令,这样如果存在无限循环,该命令就不会永远运行。我正在使用子流程模块。这是我的代码:
import subprocess
subprocess.call("yes > output.txt", timeout=1, shell=True)
当我运行它时,我在 1 秒后按预期收到了 subprocess.TimeoutExpired 异常,但该进程没有被终止。如果我查看htop,我仍然看到yes 进程正在运行。
奇怪的是,如果我通过解释器运行它,并在提示 引发异常后按Ctrl+C,则会终止进程。我只是在这里做一些愚蠢的事情吗?
我在带有 Python 3.7.7 的 macOS Catalina 以及带有 Python 3.6.9 的 Ubuntu 18.04 上都得到了这种行为
编辑:
如果我的命令将输出重定向到文件,我不确定为什么会出现不一致。例如:
subprocess.call("sleep 100", timeout=1, shell=True)
确实在超时时终止进程。但是,以下内容:
subprocess.call("sleep 100 > f", timeout=1, shell=True)
不会杀死进程。我知道在这种情况下,实际上没有任何内容被重定向到该文件。
更重要的是,我的实际问题是,我将如何在所有情况下在超时后杀死子进程?
【问题讨论】:
-
看看这个如果它能够帮助你。 stackoverflow.com/questions/19447603/…
标签: python subprocess