我在 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 操作系统上,terminate
比 kill
更温和,因为它降低了创建僵尸进程的风险。
关于python - 在抛出 subprocess.TimeoutExpired 后杀死 Python 子进程的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44909625/