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

Rap*_*tor 6 python subprocess python-3.x

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

有什么办法可以使用 subprocess.run 做到这一点,还是必须重新使用 Popen?由于 run 被阻塞,我无法将 pid 保存在某个地方以在额外的命令中杀死子进程。一个简短的代码示例:

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

Tan*_*anu 0

引用文档:

subprocess.run - 默认情况下不捕获 stdout 或 stderr。为此,请为 stdout 和/或 stderr 参数传递 PIPE。

如果您不愿意,不必使用 Popen()。模块中的其他函数,如.call()、.Popen()。

共有三个“文件”流:stdin 用于输入,stdout 和 stderr 用于输出。应用程序决定在哪里写什么;通常错误和诊断信息发送到 stderr,其余的发送到 stdout。要捕获其中任一输出的输出,请指定 subprocess.PIPE 参数,以便将“流”重定向到您的程序中。

超时后终止子进程:

import os
import signal
import subprocess

try:
    proc = subprocess.Popen(["ls", "-l"], stdout=PIPE, stderr=PIPE, timeout=120)
except subprocess.TimeoutExpired:
    os.kill(proc.pid, signal.SIGTERM)
Run Code Online (Sandbox Code Playgroud)