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

