我需要运行可能催生其他进程的进程(程序,bash脚本等),但是我还需要应用超时以防万一挂断,并且希望程序在超时到期后继续执行。我正在使用以下run()函数:
import subprocess, shlex, threading
from threading import Timer
def run(cmd, timeout_sec=5):
def kill_proc(proc, timedout):
timedout['value'] = True
proc.kill()
try:
proc = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
timedout = {'value': False}
timer = threading.Timer(timeout_sec, kill_proc, [proc, timedout])
timer.start()
stdout, stderr = proc.communicate()
timer.cancel()
return stdout.decode('utf-8'), stderr.decode('utf-8'), proc.returncode, timedout['value']
except Exception as e:
print('Could not execute: %s - with error: %s' % (cmd, e))
return '', '', 1, False
在大多数情况下都可以正常工作,并且可以使呼叫超时,例如:
run(cmd='sleep 1m', timeout_sec=2)
好像挂断了电话,假设我有以下bash脚本,称为sleeper.sh:
#!/bin/bash
sleep 1m
,如果我发出以下命令:
run(cmd='sleeper.sh', timeout_sec=2)
它将坐在那里,等待1分钟,直到命令完成。是否有一种方法可以重写我的run()函数,以使该进程强制超时,而不管产生了什么子进程?
答案 0 :(得分:1)
这是有关如何在bash中实现此目的的示例代码。您可能可以将其应用于您的程序:
$ date; timeout 1 sleep 5 ; date
Sat Dec 8 18:02:44 UTC 2018
Sat Dec 8 18:02:45 UTC 2018
因此,简而言之,请查看在命令开头之前添加“超时持续时间”是否可行。