GNU Parallel 是一個強大的命令列工具,可並行在多台機器上執行命令,極大簡化集群運維操作。本文通過實例展示其在 Cron 任務批量管理、文件收集、輸出標籤等場景的應用。
建立 host.lst 文件,每行一個 SSH 登入規格,例如:
user@192.168.1.10
user@192.168.1.11
user@192.168.1.12
確保已配置 SSH 免密登入(或使用 ssh-agent)。
parallel --nonall -j0 --slf host.lst "hostname; crontab -l"
--nonall:無輸入參數,直接在所有 --slf 指定的主機上執行-j0:最大並行數(不限制)--slf:讀取 SSH 登入列表文件parallel --nonall -j0 --slf host.lst "hostname; ls -l /var/spool/cron"
parallel --nonall -j0 --slf host.lst \
'echo "0 0 * * * cd /root/nmon;/root/nmon/nmon -f -s600 -c144" > /var/spool/cron/root'
注意:引號嵌套需轉義,建議使用單引號包裹整個命令,內部雙引號轉義。
--tag 會在每行輸出前加上標識:
--nonall)時:標識為 SSH 登入規格(即 host.lst 中的行)parallel --tag --nonall -j0 --slf host.lst uptime
輸出示例:
user@192.168.1.10 10:00:01 up 30 days, 2:15, 1 user, load average: 0.12, 0.08, 0.05
user@192.168.1.11 10:00:01 up 45 days, 5:30, 2 user, load average: 0.05, 0.03, 0.01
從所有主機下載 /root/nmon/ 下匹配 *160401*.nmon 的文件到當前目錄:
parallel -a host.lst scp '"{}:/root/nmon/*160401*.nmon"' .
-a host.lst:從文件讀取參數列表(每行一個主機){}:佔位符,代表當前行內容| 參數 | 說明 |
|---|---|
--nonall | 無輸入流,直接在所有 --slf 主機執行命令 |
-j N | 最大並行任務數,0 表示無限制 |
--slf FILE | 從文件讀取 SSH 登入列表 |
--tag | 輸出行前添加標籤 |
-a FILE | 從文件讀取輸入參數(替代 stdin) |
GNU Parallel 還支持超時控制、重試、進度條、負載均衡等高級功能,詳見 man parallel 或官方 教程。善用此工具,可將原本串行耗時的運維操作縮減數十倍。