0

curl批量检测网站状态码脚本:5个实战方案让网站健康巡检自动化

2026.06.03 | youres | 19次围观

为什么用 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 批量检测网站状态码并不复杂,关键是根据实际需求选择合适的方案:

场景推荐方案
少量域名快速检查方案一:基础版
大量域名高效巡检方案二:xargs 并行
需要分类排查问题方案三:结果过滤
需要留存巡检记录方案四:CSV 报告
Windows 运维环境方案五:PowerShell

掌握这些方案,网站健康巡检就能从手动逐个检查升级为全自动化流程,运维效率提升不止一个档次。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论