杀死使用 python sh 启动的后台进程

用户1625344

我有一个使用 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,您需要改为传递timeoutwait调用,例如:

    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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章