了解subprocess.TimeoutExpired,想要在发生超时后杀死子进程

直流电

有人可以帮助我了解timeout参数在子流程模块中如何工作,以及如何正确使用subprocess.TimeoutExpired异常吗?

我的用例是我有一个主运行程序,该程序运行子进程作为其重复例程的一部分。子进程有时会挂起。我想防止这种情况拖延一切。

我以为我可以使用timeout参数给孩子运行这么长时间。但是,在下面的示例程序中,行为不是我所期望的。运行parent.py时,它确实启动child.py,我可以看到child.py的输出计数了。4s之后,parent.py确实获得了subprocess.TimeoutExpired异常,但是child.py的输出不断出现。这使我相信child.py进程实际上并未被杀死。文档似乎暗示它将被杀死:

超时参数传递给Popen.wait()。如果超时到期,子进程将被终止,然后再次等待。子进程终止后,将重新引发TimeoutExpired异常。

那么,如何解决这个问题呢?收到超时异常后,我是否需要以某种方式杀死自己的孩子进程?

谢谢您的帮助。

parent.py

#!/usr/bin/env python3

import os
import sys
import subprocess

p = subprocess.Popen("/path/to/python3 /path/to/child.py", shell=True)
try:
    p.wait(timeout=4)
except subprocess.TimeoutExpired:
    print("we got a timeout. exiting")
    sys.exit(1)

child.py

#!/usr/bin/env python3

import os
import sys
import time

for i in range(200):
    print("i is {}".format(i))
    time.sleep(1)
亚历克斯·马特利

看来您需要添加通话

    p.terminate()

sys.exit父进程之前-根据当前文档(https://docs.python.org/3/library/subprocess.html#subprocess.Popen),您引用的位仅适用于subprocess.call,而不是您使用的位这里。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Linux

子进程终止时了解SIGCHLD

来自分类Linux

父母去世时如何杀死用subprocess.check_output()创建的python子进程?

来自分类Linux

在Bash中给定超时后如何杀死子进程?

来自分类Dev

了解Golang上下文超时

来自分类Dev

python subprocess.Popen使用子进程杀死进程

来自分类Dev

为什么要在等待后检查WIFEXITED以杀死Linux系统调用中的子进程?

来自分类Dev

终止使用“ subprocess.run”创建的进程

来自分类Dev

Subprocess.Popen几秒钟后停止(或发生故障)

来自分类Dev

在Linux中,您如何了解新近获得的子进程退出?

来自分类Dev

Python子进程杀死超时

来自分类Dev

了解LINQ子查询

来自分类Dev

了解Docker容器进程

来自分类Dev

了解线程GHC Haskell程序的子进程

来自分类Dev

超时后杀死多个子进程的子进程?

来自分类Dev

了解CSS转换后的缩放

来自分类Dev

我的进程被杀死了,但我不了解内核通知

来自分类Dev

确定发生了解密

来自分类Dev

进程终止时,psutil / subprocess返回代码

来自分类Dev

了解后台进程何时终止

来自分类Dev

试图了解系统目标想要什么

来自分类Dev

做斯卡拉!subprocess命令等待子进程完成?

来自分类Dev

创建子进程并在调用该进程后将其杀死

来自分类Dev

如何使外壳了解通过subprocess.call()传递的通配符

来自分类Dev

第一行后杀死子进程

来自分类Dev

了解导出命令:成为已经启动的子进程中的变量?

来自分类Dev

subprocess.check_output与超时进程终止被推迟

来自分类Dev

父进程终止后如何杀死所有子进程?

来自分类Dev

Python:退出后保持由 subprocess.Popen 启动的进程

来自分类Dev

Subprocess.Popen 路由子进程 stdout,stderr 到父进程

Related 相关文章

热门标签

归档