子进程超时失败

悦诗风吟

我想在子流程上使用超时

 from subprocess32 import check_output
 output = check_output("sleep 30", shell=True, timeout=1)

不幸的是,尽管这会引起超时错误,但它会在30秒后发生。看来check_output无法中断shell命令。

在Python方面我该怎么做才能阻止这种情况?我怀疑subprocess32无法杀死超时的进程。

杰夫斯

check_output()超时基本上是

with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
    try:
        output, unused_err = process.communicate(inputdata, timeout=timeout)
    except TimeoutExpired:
        process.kill()
        output, unused_err = process.communicate()
        raise TimeoutExpired(process.args, timeout, output=output)

有两个问题:

它导致您观察到的行为:TimeoutExpired在一秒钟内发生了事件,shell被杀死,但check_output()仅在孙sleep进程退出后30秒内返回

要变通解决此问题,请杀死整个进程树(属于同一组的所有子进程):

#!/usr/bin/env python3
import os
import signal
from subprocess import Popen, PIPE, TimeoutExpired
from time import monotonic as timer

start = timer()
with Popen('sleep 30', shell=True, stdout=PIPE, preexec_fn=os.setsid) as process:
    try:
        output = process.communicate(timeout=1)[0]
    except TimeoutExpired:
        os.killpg(process.pid, signal.SIGINT) # send signal to the process group
        output = process.communicate()[0]
print('Elapsed seconds: {:.2f}'.format(timer() - start))

输出

Elapsed seconds: 1.00

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等待子进程超时

来自分类Dev

等待子进程超时

来自分类Dev

超时子进程pid

来自分类Dev

如何使vala子进程超时?

来自分类Dev

Python中的子进程超时

来自分类Dev

超时终止进程和任何子进程

来自分类Dev

编译失败:子进程失败

来自分类Dev

Python对Popen子进程使用超时

来自分类Dev

(PHP)等待子进程超时退出

来自分类Dev

asyncio在超时时终止子进程

来自分类Dev

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

来自分类Dev

如果失败则如何退出python子进程

来自分类Dev

通过子进程运行Python脚本失败

来自分类Dev

python子进程对irfanview的调用失败

来自分类Dev

设置不活动超时Perl(Mojo)子进程

来自分类Dev

无法启动“ MyApplication”启动失败:进程启动失败:等待应用程序启动超时?

来自分类Dev

python-PipeMapRed.waitOutputThreads():子进程失败,代码为1

来自分类Dev

MongoDB:错误:子进程失败,退出,错误号为14

来自分类Dev

C,向子进程发送消息失败。为什么?

来自分类Dev

如果创建multiprocessing.Pool,则Python子进程wait()失败

来自分类Dev

莱宁根 REPL 中的子进程失败

来自分类Dev

NodeJS 子进程 EXEC 命令失败,NVM 权限被拒绝 OSX

来自分类Dev

从管道读取的子进程失败,似乎出现故障

来自分类Dev

尝试在子进程 (Javascript) 中导入模块并失败

来自分类Dev

GNU进程并行超时

来自分类Dev

超时子进程:发生TimeoutExpired异常后该怎么办?

来自分类Dev

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

来自分类Dev

无法使用multiprocessing.Process()交换子进程的对象/超时

来自分类Dev

摩卡失败,显示“超时”

Related 相关文章

热门标签

归档