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

Linux下用timeout限制wget下载超时后返回码为0,如何让超时返回非0?

问题描述

执行带4分钟超时限制的wget命令,脚本逻辑为超时后返回124标记超时状态,正常完成则返回0。但实际wget在4分钟时停止后,返回码却为0,无法触发超时分支逻辑。脚本代码如下:

timeout 4m wget -c -O "/aci/mnt/$ID/$ID.sra" $URL
writeLog "wget exit..."
RESULTCODE=$?
                
if [ $RESULTCODE -eq 0 ]; then 
    writeLog "wget Success!"
    completeMessage
    postOrchestrator
    writeLog "exit RESULTCODE=$RESULTCODE"
    exit $RESULTCODE
elif [ $RESULTCODE -eq 124 ]; then
    writeLog "Timeout of wget occurred; abandon message!"
    writeLog "exit RESULTCODE=$RESULTCODE"
    exit $RESULTCODE
else
    writeLog "wget failed! RESULTCODE=$RESULTCODE"
fi 
解决方案

核心原因

默认情况下,timeout会先发送SIGTERM信号终止子进程。若wget收到SIGTERM后主动退出并返回0(特殊场景下可能出现),timeout会返回子进程的退出码,而非超时专属的124。

修复方法

修改timeout命令,强制使用SIGKILL信号终止wget,同时给$URL添加双引号避免特殊字符解析错误:

timeout -s SIGKILL 4m wget -c -O "/aci/mnt/$ID/$ID.sra" "$URL"

原理说明

  • -s SIGKILL参数让timeout直接发送强制终止信号,wget无法主动处理该信号,会被立即终止,此时timeout会明确返回124作为超时退出码,触发脚本中的超时分支逻辑
  • 给$URL加双引号可避免URL包含空格、特殊字符时出现解析错误,确保命令执行准确

额外验证

如果修改后仍有问题,可先单独执行以下命令测试timeout本身的行为:

timeout 4m sleep 5m
echo $?

正常情况下会输出124,以此确认timeout命令的基础功能正常。


内容的提问来源于stack exchange,提问作者jlo-gmail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:15:51