curl 设置 --retry 后,Connection was reset 仍直接结束下载
curl 的 --retry 只重试特定失败。接收连接重置后未重试时,核对版本与错误范围,在允许重复的只读下载中使用有界重试,并处理不完整文件。
下载命令已经带了 --retry 5,遇到 curl: (56) Recv failure: Connection was reset 后却直接结束,没有继续尝试。增加重试次数仍可能没有变化,因为次数只对符合重试条件的失败生效。
curl 默认的重试条件包括超时及部分 HTTP、FTP 临时错误,不是所有传输错误。接收过程中连接被重置,不能仅凭错误码 56 就认为它一定属于默认重试集合。这个区别解释的是“为什么没有重试”,不能说明连接究竟被服务器、代理还是网络设备重置。
确认运行的是哪一个 curl
在实际执行下载的环境中查看:
curl --version
如果通过 SSH 在另一台机器上启动下载,应检查远端运行的程序,不能拿本机版本代替。容器、CI 与交互终端也可能调用不同路径。
--retry-all-errors 从 curl 7.71.0 开始提供,必须与 --retry 一起使用。旧版本出现未知选项时,应通过环境支持的渠道更新工具,或在调用脚本里设计针对性重试;不要为这项功能覆盖系统库。7.71.0 只是选项引入版本,不是建议固定安装的版本。
--retry-connrefused 处理的是连接被拒绝,不等于已经建立连接后接收数据时被重置。不要因为两个错误都包含 connection 就互相替换。
只对允许重复获取的下载扩大重试范围
对于已经确认允许重复 GET、地址可信、不会触发业务写入的文件下载,可以将失败纳入有界重试。下面使用 POSIX 风格 shell,保存为单独脚本;示例地址需要替换,输出路径必须是专用测试目录中可新建或覆盖的文件。
if curl --silent --show-error --fail \
--retry 3 --retry-all-errors \
--retry-max-time 120 --connect-timeout 10 --max-time 60 \
--output ./package.part \
'https://download.example.com/package.tar.gz'; then
printf '%s\n' '下载完成,请先校验文件'
else
download_status=$?
printf '下载失败,curl 状态码:%s\n' "$download_status" >&2
exit "$download_status"
fi
--retry 3 表示最多再尝试三次,不是总共三次。上面的秒数只是示例,应按下载大小和允许等待的时间调整。--max-time 限制每次传输,--retry-max-time 在开始下一次重试前检查累计时间;已经开始的传输可以超过这个累计门槛,因此它不是整个命令严格不超过 120 秒的保证。
没有设置固定重试间隔时,curl 使用退避等待;服务器的 Retry-After 也可能影响等待。需要严格限制整个任务时间的调度系统,应单独管理任务期限,不能只看一个重试参数。
--fail 让通常的 HTTP 错误响应成为失败,避免下载错误页面后直接使用。但与 --retry-all-errors 组合后,明确的 404 等错误也可能被反复请求。地址错误、鉴权失败或证书配置错误应修复原因,重复请求不会自动解决它们;不要把这一组合加入所有 curl 命令的全局默认配置。
让 curl 自己管理输出文件
这里使用 --output,没有用 curl ... > package.part,也没有把响应体直接交给管道消费者。curl 重试文件下载时可以清理本次失败尝试写入的部分数据;对 shell 重定向或管道输出,它不能同样重置已经交出去的内容,可能产生重复片段。
即使使用 --output,最终失败后仍可能留下不完整文件。失败分支不能继续解压、安装或覆盖正式文件。成功后也应按发布方的可信校验和、签名及预期文件类型核验,再交给后续步骤;“不再报连接重置”不代表文件来源或业务内容已正确。
不要把示例直接改成上传、支付或创建任务请求。连接断开时,服务端可能已经处理了提交,只是响应没有完整到达客户端;扩大重试范围可能再次执行同一操作。需要由接口的幂等机制和调用方状态判断决定是否重试。
区分重试恢复与持续故障
在受控下载环境中检查:发生一次已知的可恢复接收故障后是否出现后续尝试;达到次数或时间条件后是否失败退出;失败产物是否被后续流程拒绝。无需在生产链路上故意断网制造问题。
持续出现 56 时,保留错误发生时间、实际版本、目标地址和必要的脱敏日志,再检查服务端与中间代理的断连记录。不能仅凭这条错误关闭证书校验或随意放宽超时。回退时恢复原下载参数;已经写入的测试文件另行核对,旧配置不会自动清除失败产物。


