python - 在抛出 subprocess.TimeoutExpired 后杀死 Python 子进程的子进程

标签 python python-3.x subprocess

我在 Python 中调用一个 shell 脚本,它会生成多个子进程。如果它在两分钟后仍未完成,我想终止该进程及其所有子进程。

有什么方法可以使用 subprocess.run 来实现,还是我必须返回使用 Popen?由于运行是阻塞的,我无法将 pid 保存在某个地方以通过额外的命令杀死 child 。一个简短的代码示例:

try:
    subprocess.run(["my_shell_script"], stderr=subprocess.STDOUT, timeout=120)
except subprocess.TimeoutExpired:                                                                      
    print("Timeout during execution")

最佳答案

此问题被报告为 bug给 Python 开发人员。它似乎专门发生在重定向 stderr 或 stdout 时。 这是@Tanu 代码的更正确版本。

import subprocess as sp

try:
    proc = sp.Popen(['ls', '-l'], stdout=sp.PIPE, stderr=sp.PIPE)
    outs, errs = proc.communicate(timeout=120)
except sp.TimeoutExpired:
    proc.terminate()

Popen 不接受 timeout 作为参数。它必须传递给 communicate。 在 Posix 操作系统上,terminatekill 更温和,因为它降低了创建僵尸进程的风险。

关于python - 在抛出 subprocess.TimeoutExpired 后杀死 Python 子进程的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44909625/

相关文章:

python - 为什么 pandas dataframe 单元格的 id 会随着每次执行而变化?

用于 Traceroute 的 Python 脚本和打印文件中的输出显示错误(OSError : [Errno 2] No such file or directory) in Linux Mint

Python - 有效访问 Pandas 数据框的列

python - xlsxwriter 创建的损坏的 xlsx 文件

python - matplotlib.pyplot 和 matplotlib.figure 有什么区别?

python - 在python中动态获取类级别变量的类名

bash后台进程修改全局变量

Python popen 命令。等待命令完成

java - 如何在 Robot Framework 中调用基于 Java 和 Python 的库?

python - 从 shell 脚本获取 pytest 退出代码