parallel — 平行執行多個工作
平行執行多個指令或工作,充分利用多核 CPU,效率遠高於序列執行。
語法
parallel [選項] [指令] ::: [引數...]
常用選項
| 選項 | 說明 | 範例 |
|---|---|---|
-j N |
同時執行的工作數(預設 = CPU 核心數) | parallel -j 4 gzip ::: *.log |
::: |
以命令列引數方式提供輸入 | parallel echo ::: a b c |
:::+ |
多個輸入來源並行(而非笛卡兒積) | parallel echo ::: a b :::+ 1 2 |
--progress |
顯示進度條 | parallel --progress ... |
--bar |
顯示進度條(帶百分比) | parallel --bar ... |
-k, --keep-order |
保持輸出順序與輸入順序一致 | parallel -k echo ::: 1 2 3 |
--results 目錄 |
將每個工作的輸出儲存到指定目錄 | parallel --results outdir/ cmd ::: * |
{} |
替代字串(代表當前輸入項目) | parallel gzip {} ::: *.log |
{.} |
不含副檔名的替代字串 | parallel convert {}.png {.}.jpg ::: *.png |
使用範例
範例 1:平行壓縮多個檔案
同時壓縮所有 .log 檔案,使用全部 CPU 核心,速度是序列壓縮的 N 倍。
$ parallel gzip ::: *.log
範例 2:平行下載多個 URL
同時下載 4 個 URL(-j 4 限制同時連線數)。
$ cat urls.txt | parallel -j 4 wget -q {}
範例 3:平行處理並顯示進度
對目錄中的每個圖片進行縮圖處理,顯示進度條。
$ parallel --bar convert {} -resize 800x600 thumb/{} ::: images/*.jpg
100% 45:0=0 ETA 00:00:00 45/45 convert...
範例 4:從標準輸入讀取並平行處理
讀取伺服器清單,平行執行 ssh 指令。
$ cat servers.txt | parallel -j 10 ssh {} "uptime"
server1: 10:30:00 up 5 days
server2: 10:30:01 up 2 days
常見錯誤與排錯
parallel: command not found
- 原因
- GNU parallel 未安裝(xargs 是系統預裝品,parallel 需要安裝)。
- 解法
- sudo apt install parallel(Debian/Ubuntu)。