0

Shell脚本curl批量请求实战:4种方法让网站巡检效率翻倍

2026.06.15 | youres | 6次围观

前言

做网站运维的同学都知道,巡检几十上百个URL时,一个个手动curl不仅慢,还容易出错。写一个自动化脚本听起来简单,但选错方法,执行效率可能相差几十倍。本文从实际场景出发,演示4种不同的curl批量请求实现方式,配合真实代码和性能数据,帮你找到最适合自己场景的那一种。

方法一:for循环顺序执行

最基础的方式,适合URL数量少(10个以内)、对执行顺序有要求,或者需要把每条结果单独处理的场景。

#!/bin/bash
URLS=(
  "https://www.example.com"
  "https://api.example.com/health"
  "https://cdn.example.com/status"
)

for url in "${URLS[@]}"; do
  http_code=$(curl -o /dev/null -s -w "%{http_code}" "$url")
  time_total=$(curl -o /dev/null -s -w "%{time_total}" "$url")
  echo "$url | $http_code | ${time_total}s"
  if [ "$http_code" != "200" ]; then
    echo "异常: $url 返回 $http_code"
  fi
done

优点是逻辑清晰、便于调试,缺点是每个请求必须等上一个完成才开始下一个,10个URL每个耗时1秒就要10秒。

方法二:xargs并行执行

Linux系统基本都自带xargs,配合-P参数可以轻松实现并发请求,不需要额外安装任何工具。

#!/bin/bash
URLS_FILE="urls.txt"

check_url() {
  url="$1"
  http_code=$(curl -o /dev/null -s -w "%{http_code}" "$url")
  time_total=$(curl -o /dev/null -s -w "%{time_total}" "$url")
  echo "$url|$http_code|${time_total}s"
}
export -f check_url

# -P 8: 同时运行8个并发进程
cat "$URLS_FILE" | xargs -I {} -P 8 bash -c 'check_url "$@"' _ {} \
  | awk -F'|' '{print $1": "$2" ("$3"s)"}'

echo "---汇总---"
grep -v "|200|" results.tmp || echo "全部正常"

xargs -P 8表示同时跑8个并发进程。同样10个URL,每个1秒,执行时间从10秒缩短到约2秒。建议并发数设置为CPU核心数的2-4倍,避免本地带宽成为瓶颈。

方法三:GNU Parallel并发请求

如果系统安装了GNU Parallel,这个工具比xargs更强大,支持自动控制并发数、结果按序输出、进度显示等高级功能。

#!/bin/bash
# 安装: apt install parallel / yum install parallel
URLS_FILE="urls.txt"
LOG_FILE="results_$(date +%Y%m%d_%H%M%S).log"

check_url() {
  url="$1"
  http_code=$(curl -o /dev/null -s -w "%{http_code}" "$url")
  time_total=$(curl -o /dev/null -s -w "%{time_total}" "$url")
  echo "$url|$http_code|${time_total}s"
}
export -f check_url

total_lines=$(grep -c . "$URLS_FILE")
echo "开始巡检,${total_lines}个URL..."
cat "$URLS_FILE" | parallel -j 10 --progress "check_url {}" | tee "$LOG_FILE"

echo ""
echo "---异常URL---"
grep -v "|200|" "$LOG_FILE" | grep -v "^$"

GNU Parallel的核心参数:

  • -j 10:同时运行10个并发任务
  • --progress:显示实时进度和预计完成时间
  • --line-buffer:实时输出每行结果

方法四:curl自带--next参数批量请求

curl 7.76.0之后的版本支持--next参数,可以在一条命令中对多个URL分别指定不同的输出格式,适合需要差异化对待每个URL的场景。

#!/bin/bash
# curl >= 7.76.0
curl --next   -o /dev/null -s -w "主页: %{http_code} | %{time_total}s
"   https://www.example.com   --next   -o /dev/null -s -w "API: %{http_code} | %{time_total}s
"   https://api.example.com/health   --next   -o /dev/null -s -w "CDN: %{http_code} | %{time_total}s
"   https://cdn.example.com/status

这种方式本质上是串行执行,但胜在一条命令搞定多个不同URL的不同配置,不需要写循环,适合临时快速检查。

4种方法横向对比

方法安装依赖并发能力适用规模推荐度
for循环串行1-10个URL一星
xargs -P自定义10-500个URL四星
GNU Parallel需安装自动控制10-10000个URL五星
curl --nextcurl>=7.76串行3-10个URL二星

生产环境建议

  • 日常巡检(10-50个URL):用xargs -P,配合crontab定时执行,结果输出到CSV文件
  • 大规模巡检(100+URL):用GNU Parallel,设置-j为CPU核心数的2倍
  • 超大批量(1000+URL):配合curl -w @模板文件,把变量一次性格式化输出到JSON
  • 需要断点续传:把已检测的URL记录到文件,每次运行前先排除

总结

批量curl请求没有唯一最优解,关键看你的场景。个人建议:xargs -P是性价比最高的选择,大多数Linux系统自带,并发控制简单,效果明显。如果追求更专业的批量处理体验,再装GNU Parallel。

相关文章

版权声明

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

发表评论