首页/网络/网络排障速查/curl 退出码判读(6/7/28/35/52)

curl 退出码判读(6/7/28/35/52)

脚本化排障靠退出码分类:6=DNS 失败、7=连接失败、28=超时、35=TLS 握手失败、52=服务端空回复;先按码定性,再逐层深入。

网络排障速查网络更新于 2026-10-13

退出码判读是什么

在脚本与自动化巡检里,判断「通不通」不能只看输出文字,而要看进程退出码。curl 为不同失败原因分配了不同编号:解析失败、连接失败、超时、握手失败、服务端空回复各有各的码,因此一个数字就能把问题分层,再按层深入验证。把退出码接进监控告警,还能直接区分「链路断了」与「证书过期」这一类完全不同的故障。

基本信息

适用平台Linux、macOS 与 Windows 上的同名工具,退出码语义一致
常用组合-sS 静默进度但保留错误信息、限制连接阶段超时、限制整段耗时
读法先按码定性(解析/连接/超时/握手/空回复),再进入对应层验证
脚本要点必须检查上一条命令的退出状态,否则失败会被当成成功继续往下走
注意退出码反映最后一次请求的结果,跟随重定向后目标不可达同样会体现

典型使用场景

  • 巡检脚本无法区分失败原因,用一个数字把网络、证书与应用问题分开
  • 排障时先跑一次只取退出码的请求,快速把方向缩到某一层
  • 证书到期监控:用握手类错误码在到期前发现异常
  • 多目标批量巡检:逐个记录状态码与退出码,形成一张对照表
  • 验证修复:改动之后重跑同一脚本,用退出码的变化确认问题消除

查看与脚本化

查看与脚本化
curl -sS -o /dev/null --connect-timeout 3 http://<目标>:8080/; echo "rc=$?"   # 只取退出码
curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' --max-time 5 <URL>    # 状态码与耗时
for u in <URL1> <URL2>; do curl -sS -o /dev/null -w '%{http_code} ' --max-time 5 "$u"; echo "rc=$? $u"; done   # 批量巡检
curl -v --connect-timeout 3 <URL> 2>&1 | grep -E 'Connected|SSL|HTTP/'    # 超时类错误看卡在哪一步
curl -sS -o /dev/null --max-time 5 https://<域名>/; echo "rc=$?"          # 握手类错误查证书
curl -sS -o /dev/null --max-time 5 http://<IP>:<端口>/; echo "rc=$?"      # 连接类错误查监听与策略

退出码对照

退出码含义优先怀疑
0请求成功完成业务是否正常仍需看状态码与响应体
6无法解析主机名DNS 配置或解析服务
7无法连接(拒绝或不可达)端口未监听、策略拒绝、路由缺失
28操作超时中间设备静默丢弃、链路质量差、服务无响应
35TLS 握手错误证书、协议版本、中间设备拦截
52服务端空回复后端进程崩溃或被重置
56接收数据失败连接中途被中断
60证书校验失败证书链不全、自签名或系统时间不对
静默与报错要一起用:只加静默参数会把错误信息一并吞掉,脚本出问题时无从下手;同时加上保留错误信息的参数,才能既干净输出又拿到失败原因。
退出码与状态码是两回事:接口返回 500 时连接是成功的,退出码仍为 0。判断服务是否可用要同时看状态码与响应体,不能只看退出码。

易错点

  • 用了静默参数又不检查退出码,把失败当成功继续执行后续流程
  • 把超时类错误一律归因服务端慢:也可能是中间设备静默丢包
  • 只看退出码不看状态码,错过应用层返回的错误页
  • 批量巡检里不区分错误类型,所有失败都混在一起,排查时没有优先级

数据来源与参考

  • curl 手册:EXIT CODES 章节
  • curl 官方文档

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌