2026.06.03 | youres | 21次围观
为什么用 curl 检测状态码
curl 的 -o /dev/null -s -w "%{http_code}" 组合是获取 HTTP 状态码的经典写法:
-o /dev/null:丢弃响应体,只关心状态码-s:静默模式,不输出进度条-w "%{http_code}":只打印 HTTP 状态码
这三个参数搭配,一条命令就能拿到任何 URL 的状态码,简单、高效、无依赖。
方案一:基础版——从文件批量读取 URL
最简单的批量检测方案,适合域名数量不多(几十个以内)的场景。
#!/bin/bash
# check_status.sh
while IFS= read -r url; do
code=$(curl -o /dev/null -s -w "%{http_code}" -L --max-time 10 "$url")
echo "$url -> $code"
done < urls.txt
使用方法:
chmod +x check_status.sh
./check_status.sh
urls.txt 内容示例:
https://www.example.com
https://api.example.com/health
https://blog.example.com
输出示例:
https://www.example.com -> 200
https://api.example.com/health -> 200
https://blog.example.com -> 301
这个方案直接够用,但如果 URL 数量超过 100 个,串行请求会非常慢。这时需要并行方案。
方案二:并行加速——xargs 并发检测
利用 xargs 的 -P 参数实现并行请求,速度提升 10 倍以上。
#!/bin/bash
# check_parallel.sh
cat urls.txt | xargs -P 20 -I {} bash -c \
'echo "{} -> $(curl -o /dev/null -s -w "%{http_code}" -L --max-time 10 {})"'
核心参数说明:
-P 20:同时发起 20 个请求,根据网络和目标服务器承受能力调整-I {}:将每个 URL 作为参数传入-L:跟随重定向,获取最终状态码--max-time 10:单个请求超时 10 秒
注意并行数量不要设太大,避免对目标服务器造成过大压力。生产环境建议 10-20 个并发。
方案三:结果过滤——按状态码分类统计
批量检测后,往往需要分类查看:哪些正常(200)、哪些跳转(301/302)、哪些异常(4xx/5xx)。
#!/bin/bash
# check_filtered.sh
while IFS= read -r url; do
code=$(curl -o /dev/null -s -w "%{http_code}" -L --max-time 10 "$url")
case "$code" in
200|201|204) echo "[OK] $url -> $code" ;;
301|302|307|308) echo "[REDIRECT] $url -> $code" ;;
403|404|405) echo "[CLIENT_ERROR] $url -> $code" ;;
500|502|503|504) echo "[SERVER_ERROR] $url -> $code" ;;
000) echo "[TIMEOUT] $url -> $code" ;;
*) echo "[UNKNOWN] $url -> $code" ;;
esac
done < urls.txt
状态码 000 是 curl 的特殊返回值,表示请求超时或 DNS 解析失败,排查时优先关注。
方案四:结果持久化——输出 CSV 报告
巡检结果保存为 CSV 文件,方便导入 Excel 分析或后续对比。
#!/bin/bash
# check_csv.sh
echo "URL,状态码,检测时间,结果" > report.csv
while IFS= read -r url; do
code=$(curl -o /dev/null -s -w "%{http_code}" -L --max-time 10 "$url")
time=$(date "+%Y-%m-%d %H:%M:%S")
case "$code" in
200|201|204) result="正常" ;;
301|302|307|308) result="重定向" ;;
403|404|405) result="客户端错误" ;;
500|502|503|504) result="服务器错误" ;;
000) result="超时" ;;
*) result="未知" ;;
esac
echo "\"$url\",$code,\"$time\",\"$result\"" >> report.csv
done < urls.txt
CSV 输出示例:
URL,状态码,检测时间,结果
"https://www.example.com",200,"2026-06-03 15:00:01","正常"
"https://old.example.com",301,"2026-06-03 15:00:02","重定向"
"https://down.example.com",502,"2026-06-03 15:00:12","服务器错误"
方案五:PowerShell 版本——Windows 运维适用
Windows 环境下没有 bash,用 PowerShell 的 Invoke-WebRequest 实现同样的批量检测。
# check_status.ps1
$urls = Get-Content .\urls.txt
$results = foreach ($url in $urls) {
try {
$response = Invoke-WebRequest -Uri $url -Method Head -TimeoutSec 10 -UseBasicParsing -MaximumRedirection 0 -ErrorAction Stop
$code = [int]$response.StatusCode
} catch {
if ($_.Exception.Response) {
$code = [int]$_.Exception.Response.StatusCode
} else {
$code = "000"
}
}
[PSCustomObject]@{
URL = $url
StatusCode = $code
Time = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
}
}
$results | Export-Csv -Path .\report.csv -NoTypeInformation -Encoding UTF8
$results | Format-Table -AutoSize
PowerShell 版注意事项:
-Method Head只请求头部,速度更快-MaximumRedirection 0不跟随重定向,获取原始状态码-UseBasicParsing避免依赖 IE 解析引擎-ErrorAction Stop捕获异常状态码(如 404、500)
批量检测的实用技巧
超时设置要合理
单个请求超时建议设为 10-15 秒。太短(如 3 秒)容易误判正常的慢响应为超时,太长(如 30 秒)会让整体巡检耗时不必要地延长。
区分跟随重定向和不跟随
- 加
-L参数:获取最终页面的状态码(用户实际看到的) - 不加
-L:获取原始跳转状态码(诊断重定向链路时有用)
两者配合使用,能快速定位跳转异常。
定时巡检搭配 cron
# 每天早上 8 点执行巡检
0 8 * * * /path/to/check_filtered.sh >> /var/log/site_check.log 2>&1
结合邮件告警脚本,检测到异常状态码时自动通知运维人员。
相关文章
- curl -w格式化输出重定向信息:5个实战技巧让你精准诊断跳转链路
- curl -I查看HTTP响应头详解:5个实战技巧让你快速诊断网站状态
- curl批量检测HTTP响应头:5个实战技巧让你高效巡检网站状态
总结
curl 批量检测网站状态码并不复杂,关键是根据实际需求选择合适的方案:
| 场景 | 推荐方案 |
|---|---|
| 少量域名快速检查 | 方案一:基础版 |
| 大量域名高效巡检 | 方案二:xargs 并行 |
| 需要分类排查问题 | 方案三:结果过滤 |
| 需要留存巡检记录 | 方案四:CSV 报告 |
| Windows 运维环境 | 方案五:PowerShell |
掌握这些方案,网站健康巡检就能从手动逐个检查升级为全自动化流程,运维效率提升不止一个档次。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论