我有一个使用 python sh 作为后台进程启动的编译程序。我想运行它 20 秒,然后杀死它。我总是遇到一个我无法捕捉到的异常。代码看起来像
cmd = sh.Command('./rtlogger')
try:
p = cmd('config.txt', _bg=True, _out='/dev/null', _err='/dev/null', _timeout=20)
p.wait()
except sh.TimeoutException:
print('caught timeout')
我还尝试在捕获超时异常后使用 p.kill() 和 p.terminate() 。我看到一个以 SignalException_SIGKILL 结尾的堆栈跟踪。我似乎无法抓住这一点。堆栈跟踪没有引用我的任何代码。此外,即使我将 stdout 和 stderr 路由到 /dev/null,文本也会出现在屏幕上。
该程序似乎运行正常。记录器收集数据,但我想消除或捕获异常。任何建议表示赞赏。
_timeout
对于原始调用仅适用于在前台同步运行命令时。当您在后台异步运行命令时,使用_bg=True
,您需要改为传递timeout
给wait
调用,例如:
cmd = sh.Command('./rtlogger')
try:
p = cmd('config.txt', _bg=True, _out='/dev/null', _err='/dev/null')
p.wait(timeout=20)
except sh.TimeoutException:
print('caught timeout')
当然,在这种情况下,您没有利用它在后台的优势(在 launch 和 之间没有任何工作wait
),因此您也可以在前台运行它并保留_timeout
调用:
cmd = sh.Command('./rtlogger')
try:
p = cmd('config.txt', _out='/dev/null', _err='/dev/null', _timeout=20)
except sh.TimeoutException:
print('caught timeout')
你不需要明确地杀死或终止子进程;该_timeout_signal
参数用于在超时时向孩子发出信号(默认为signal.SIGKILL
)。如果SIGKILL
不是您想要的,您可以将其更改为另一个信号,但您不需要以任何方式调用kill
/terminate
自己;超时行为为您发送信号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句