用 curl 的重试与超时参数稳妥拉远程接口

举报
yd_257918670 发表于 2026/10/31 06:21:33 2026/10/31
【摘要】 用 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。