GNU parallel 是什么
GNU parallel 是比简单并行执行更结构化的并行器:它按参数替换串把一条命令展开成多条并行任务,带进度显示、失败策略、任务日志与超时控制。相比手工切分或用最基础的并行选项,它更适合「同一命令处理一大批输入」的批量任务,例如批量压缩日志、批量下载、批量转码。用之前一定要先看一遍展开后的命令,参数里含空格或特殊字符时尤其重要。
基本信息
| 适用平台 | GNU/Linux、macOS(需安装 GNU parallel) |
|---|---|
| 语法 | parallel [选项] 命令 ::: 参数... |
| 常用选项 | -j 并行数、--bar 进度条、--dry-run 预览、--halt 失败策略 |
| 替换串 | 原参数、去掉后缀、取文件名、序号各有写法 |
| 输入方式 | 命令行参数、管道输入、输入文件 |
| 首次运行 | 会提示引用确认,自动化脚本要提前处理 |
典型使用场景
- 批量压缩或归档大量日志文件,缩短总耗时。
- 批量下载一批文件,控制并发避免压垮源站。
- 批量转码或处理数据文件,充分利用多核。
- 批量对多台主机执行检查命令。
- 需要失败即停的场景:并行执行同时严格校验结果。
常用写法
常用写法
parallel -j 4 gzip ::: *.log # 4 并发批量压缩
ls *.csv | parallel -j 8 --bar 'process {} > {.}.out' # 管道输入加进度条
parallel --dry-run -j2 echo {} ::: a b c # 只打印将执行的命令
parallel -j2 --halt soon,fail=1 'curl -sfO https://example.com/{}' ::: a.zip b.zip
parallel -j 2 --joblog /tmp/parallel.log 'shard.sh {}' ::: 1 2 3 4 # 记录任务状态
cat hosts.txt | parallel -j 5 --timeout 30 'ssh {} uptime' # 逐台执行并限超时选项与写法对照
| 选项或写法 | 作用 | 使用要点 |
|---|---|---|
| -j 并行数 | 控制同时执行的任务数 | 从较小值调起,观察资源占用 |
| --bar | 显示进度 | 长时间批处理时便于观察 |
| --dry-run | 只打印不执行 | 参数含空格或特殊字符时必做 |
| --halt | 失败处理策略 | 控制失败时是否立即停止 |
| --joblog | 记录任务状态 | 事后核对哪些任务失败 |
| 替换串 | 参数变换 | 去后缀、取文件名、序号等常用写法 |
替换串是核心:原参数、去掉后缀、取文件名、序号各有不同写法,写错会导致输出文件覆盖或路径错误,务必先在演练模式下确认展开结果。
并行数要从小往大调:IO 密集型任务并行度开满反而更慢,需要根据磁盘与服务端的承受能力试探出最佳值。
首次运行会提示引用确认:交互环境按提示处理,自动化脚本中要通过参数或环境变量提前确认,避免任务卡在提示上。