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
相关产品推荐
相关产品推荐

