用 curl 的重试与超时参数稳妥拉远程接口
【摘要】 用 curl 的重试与超时参数稳妥拉远程接口写脚本拉远程 API 或下载文件时,最怕网络抖一下就整段失败。curl 自带超时和重试开关,配好后脚本会稳很多,也不用再包一层自己写的循环。 为什么默认不够用默认 curl 几乎一直等到 TCP 成功或对端关掉连接。链路抖动、DNS 慢、对端短暂 5xx,都会让脚本挂很久,甚至卡死在流水线里。生产脚本至少要定三件事:连接多久放弃、整体多久放弃、失...
用 curl 的重试与超时参数稳妥拉远程接口
写脚本拉远程 API 或下载文件时,最怕网络抖一下就整段失败。curl 自带超时和重试开关,配好后脚本会稳很多,也不用再包一层自己写的循环。
为什么默认不够用
默认 curl 几乎一直等到 TCP 成功或对端关掉连接。链路抖动、DNS 慢、对端短暂 5xx,都会让脚本挂很久,甚至卡死在流水线里。生产脚本至少要定三件事:连接多久放弃、整体多久放弃、失败要不要自动再试。
三个常用超时
--connect-timeout 5:建连(含 DNS)最多 5 秒。--max-time 30:整次请求(含传输)最多 30 秒。--retry 3:遇到临时错误最多再试 3 次。
临时错误通常包括连接失败、超时,以及部分 HTTP 状态。想只对 HTTP 错误重试,可加 --retry-all-errors(注意别对业务上的 4xx 盲目重试)。
一份可直接抄的模板
curl -fsSL \
--connect-timeout 5 \
--max-time 30 \
--retry 3 \
--retry-delay 2 \
--retry-connrefused \
-H "Accept: application/json" \
"https://example.com/api/v1/health" \
-o /tmp/health.json
说明:
-f:HTTP 错误直接失败,方便脚本用退出码判断。-sS:安静输出,但仍打印真正的错误。-L:跟随重定向。--retry-delay 2:两次重试间隔约 2 秒,减轻打爆对端。--retry-connrefused:对端短暂拒绝连接时也重试,适合刚发布还在滚动的服务。
和脚本退出码配合
curl 非 0 退出时,外层脚本应立刻失败,而不是继续用空文件:
set -euo pipefail
curl -fsSL --connect-timeout 5 --max-time 30 --retry 3 \
"$URL" -o "$OUT"
jq -e '.status == "ok"' "$OUT" >/dev/null
这样「网络失败」和「业务返回不健康」都能在同一套流水线里暴露出来。
下载大文件时的注意点
大文件更适合把 --max-time 放宽,或改用 --speed-limit / --speed-time:持续低于某速度就放弃,避免「假活着」的慢连接。需要断点续传时用 -C -,再配上有限次重试。
小结
给 curl 加上连接超时、总超时和有限重试,比在 bash 里手写 for 循环更短、也更不容易漏边界。把上面的模板放进日常运维脚本,远程调用会明显少踩「偶发超时把整晚任务拖死」的坑。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)