【问题标题】:bash exit 0 on timeout, exit non-0 on failurebash 超时退出 0,失败退出非 0
【发布时间】:2020-07-22 07:29:49
【问题描述】:

我想使用timeout 命令运行脚本,如果脚本运行没有问题或发生超时,则退出0。否则,如果脚本以一些 non-0 代码退出,我想保留它。

我想象的语法是 timeout 实现了类似 --exit 的东西,所以我可以写 timeout --exit 0 10s ping google.com

我见过this other answer on SO,它说您可以使用or 条件处理timeout 的退出代码,例如timeout 10s ping google.com || [[ $? -eq 143 ]]。但这是对timeout 的结果进行硬编码,如果我的脚本失败并抛出143,它将默默地失败。我也不想强制 exit 0。如果脚本失败我想知道。

我正在寻找一个保留脚本中所有失败(和非失败)的答案,但始终从 timeout 退出 0。如果有一种不使用timeout 且认知复杂度较低的解决方法,我也会考虑这样做。

【问题讨论】:

标签: bash shell timeout


【解决方案1】:

运行timeout 命令,并将其退出代码保存到变量中。将其与命令超时时的代码 124 进行比较。如果代码为 124,我们将以 0 退出以将失败的退出代码转换为成功。如果退出代码不是 124,则我们拥有原始命令的状态,因为当命令运行完成时,timeout 会以该状态退出。

timeout 10s COMMAND
status="$?"
if (( status == 124 )); then
    # Command timed out
    exit 0
fi
# Command either succeeded or failed
exit "$status"

一个问题是当原始命令以 124 退出时,timeout 也会传播该退出代码。对于此代码,它看起来像命令超时,因此当原始命令失败时它应该以非零退出时它将以 0 退出。没有(简单的)方法可以区分这两种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2014-01-05
    相关资源
    最近更新 更多