ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Shell Daily 2025-12-29: 并行加速 (Xargs Parallel)

Shell Daily 2025-12-29: 并行加速 (Xargs Parallel)

Shell Daily 2025-12-29: 并行加速 (Xargs Parallel)

在处理大量任务时(比如压缩 1000 个日志文件或下载 50 个链接),很多人的直觉是写一个 for 循环。但这有个致命弱点:它是串行的。无论你的服务器有 8 核还是 64 核,for 循环一次只用一个核,剩下的性能都在睡大觉。

要释放多核 CPU 的潜能,你不需要学习复杂的编程并发库,只需要给老牌命令 xargs 加上一个参数。

怎么用

xargs 通常被用来把输入转换成参数,但它的 -P 参数可以让它并行启动多个进程。

  • 语法... | xargs -P <进程数> -I {} command {}
  • 参数-P 0 表示尽可能多地开启进程(慎用,可能耗尽资源),通常建议设置为 CPU 核心数。
  • 兼容性Linux (GNU) 和 macOS (BSD) 通用。(注:纯 POSIX 标准未定义 -P,但在现代系统中几乎标配)。

适用场景

  • 批量计算:图片转码、视频压缩、文件加密/解密。
  • 网络请求:并发检测多个 URL 的存活状态、并发下载。

示例 1:极速压缩日志

假设你有几百个切割好的日志文件 access.log.1, access.log.2 ... 用 gzip * 处理是串行的。如果改用 -P,速度将直接翻倍:

# -P 4:同时启动 4 个 gzip 进程进行压缩
# -n 1:每次传递 1 个文件名给 gzip
ls *.log | xargs -P 4 -n 1 gzip

示例 2:并发网络扫描

如果你有一个 domains.txt 列表,想检查哪些站点挂了。用 for 循环测完 100 个需要很久,用 xargs 可以瞬间完成:

# -I {}:定义替换占位符,把读到的域名填入 {} 位置
# -P 10:保持 10 个并发连接
cat domains.txt | xargs -P 10 -I {} sh -c 'curl -o /dev/null -s -w "%{http_code} {}\n" http://{} 
'

(注:使用 -P 时,输出可能会交错在一起。如果输出顺序很重要,这招就不适用了;但对于“只管执行,不管顺序”的批处理任务,它是当之无愧的神器。)

返回列表