【问题标题】:Bash: is there a way to execute a command if another command times out?Bash:如果另一个命令超时,有没有办法执行命令?
【发布时间】:2017-10-24 22:26:50
【问题描述】:

我需要运行一个带有超时功能的命令,如果在x时间内没有执行,那么脚本将从头开始,否则它可以继续执行其他命令。我可以这样做吗?

我已经尝试过用例,但只要我使用一个,它就可以工作,如果使用两个案例,它会给我一个错误。有人知道如何超时吗?也许使用像 -s USR1 这样的用户定义信号,但我不知道如何设置它以及是否可以使用信号执行命令:/

【问题讨论】:

    标签: bash timeout


    【解决方案1】:

    如果some_command 在 10 秒内完成,这将继续执行脚本的其余部分。如果some_command 超时,则重复,直到不超时:

    while timeout 10 some_command; [ $? -eq 124 ]
    do
       :
    done
    echo "Continuing on with script"
    

    工作原理

    如果命令超时,则默认情况下,timeout 会以代码 124 退出。我们可以使用它来测试命令是否超时,因此是否需要重复。更详细:

    • while timeout 10 some_command; [ $? -eq 124 ]; do

      这会通过在 10 秒超时后执行 some_command 来启动 while loop,然后测试来自 timeout 的退出代码是否为 124。如果是 124,则循环重复。

    • :

      命令: 是一个空操作。我们不需要while 循环体中的任何命令,我们使用这个命令。

    • done

      这标志着while 循环的结束。

    特殊情况:行为不端的命令

    这假设 some_command 负责任地响应 TERM 信号。如果没有,退出代码将是 128+9 而不是 124。

    文档

    来自man timeout

    如果命令超时,并且 --preserve-status 没有设置,那么 以状态 124 退出。否则,以 COMMAND 状态退出。 如果未指定信号,则在超时时发送 TERM 信号。这 TERM 信号会杀死任何不会阻塞或捕获它的进程 信号。可能需要使用 KILL (9) 信号,因为这 信号不能被捕获,在这种情况下 退出状态是 128+9 而不是 124。

    【讨论】:

    • 但是你能解释为什么这个值吗?为什么是 124?那是通用的吗?
    • @D.Appresti 是的,124 是“通用的”。我只是在答案中添加了一些解释。 (您可能需要重新加载页面才能看到它。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2017-07-19
    • 2021-01-21
    相关资源
    最近更新 更多