You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何区分timeout命令和被调程序返回的124退出码

区分timeout命令与被调用程序返回的124退出码的方法

退出码124同时被timeout和业务程序占用的冲突场景,有两种通用可落地的解决方法:

方案1:包装业务程序,重写冲突的退出码

无需修改原业务程序代码,仅在调用时套一层bash外壳,将业务程序返回的124转换成其他未被占用的退出码(比如224),即可直接通过退出码区分来源,兼容性最高,支持所有版本的timeout工具。
修改后的示例代码如下:

# 提前清理可能存在的旧日志
rm -f log.txt
# 调用时套一层bash wrapper处理业务程序的124退出码
timeout 10s bash -c '
program
ec=$?
# 业务程序返回124时替换为224返回,其他退出码保持不变
[ "$ec" -eq 124 ] && exit 224 || exit "$ec"
' 2>&1 | tee log.txt
# 取timeout命令的退出状态
timeout_ec=${PIPESTATUS[0]}
if [ "$timeout_ec" -eq 124 ]; then
    # 此处是timeout触发超时返回的124,执行超时逻辑
    echo "超时触发,124来自timeout命令"
elif [ "$timeout_ec" -eq 224 ]; then
    # 此处是业务程序自身返回的124,执行对应业务逻辑
    echo "业务程序返回原124状态码,未触发超时"
else
    echo "程序正常退出,退出码:$timeout_ec"
fi

方案2:通过标识文件区分,不修改退出码映射

如果不想调整业务程序的退出码,可以额外生成临时标识文件判断是否真的触发超时:

# 提前清理临时标识和旧日志
rm -f .program_return_124 log.txt
timeout 10s bash -c '
program
ec=$?
# 业务程序返回124时生成专属标识文件
[ "$ec" -eq 124 ] && touch .program_return_124
exit "$ec"
' 2>&1 | tee log.txt
timeout_ec=${PIPESTATUS[0]}
if [ "$timeout_ec" -eq 124 ]; then
    if [ -f .program_return_124 ]; then
        echo "124来自业务程序,未触发超时"
        # 执行业务逻辑
    else
        echo "124来自timeout,触发超时"
        # 执行超时逻辑
    fi
fi
# 用完清理临时标识
rm -f .program_return_124

内容的提问来源于stack exchange,提问作者Trung Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:48:01