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 --next | curl>=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辅助作者原创,未经许可,转载请保留原文链接。

发表评论