退出码判读是什么
在脚本与自动化巡检里,判断「通不通」不能只看输出文字,而要看进程退出码。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 | 操作超时 | 中间设备静默丢弃、链路质量差、服务无响应 |
| 35 | TLS 握手错误 | 证书、协议版本、中间设备拦截 |
| 52 | 服务端空回复 | 后端进程崩溃或被重置 |
| 56 | 接收数据失败 | 连接中途被中断 |
| 60 | 证书校验失败 | 证书链不全、自签名或系统时间不对 |
静默与报错要一起用:只加静默参数会把错误信息一并吞掉,脚本出问题时无从下手;同时加上保留错误信息的参数,才能既干净输出又拿到失败原因。
退出码与状态码是两回事:接口返回 500 时连接是成功的,退出码仍为 0。判断服务是否可用要同时看状态码与响应体,不能只看退出码。