面對數十上百台伺服器的批量命令執行、文件收集、配置下發,傳統 for 迴圈串行太慢,pssh/ansible 又顯重裝。GNU Parallel 單機無依賴、參數化強、支援 --nonall 無輸入流模式,是輕量級叢集操作的利器。
| 參數 | 說明 |
|---|---|
--nonall | 無標準輸入流,直接在 --slf 指定的所有主機執行命令 |
-j0 | 最大並行度(不限制職位數) |
--slf host.lst | 從文件讀取 SSH 登入字串列表(格式:user@host:port) |
--tag | 輸出行前綴標記:有輸入流時為參數值,--nonall 時為 SSH 登入字串 |
-a file | 從文件讀取參數列表(非 --nonall 模式) |
# 檢視所有主機 crontab
parallel --nonall -j0 --slf host.lst "hostname; crontab -l"
# 檢視 /var/spool/cron 目錄
parallel --nonall -j0 --slf host.lst "hostname; ls -l /var/spool/cron"
# 統一下發 nmon 監控任務(每天 00:00 執行)
parallel --nonall -j0 --slf host.lst \
'echo "0 0 * * * cd /root/nmon;/root/nmon/nmon -f -s600 -c144" > /var/spool/cron/root'
parallel --tag --nonall -j0 --slf host.lst uptime
# 輸出示例:
# root@192.168.1.10 10:00:01 up 30 days, load average: 0.15, 0.10, 0.05
# root@192.168.1.11 10:00:01 up 45 days, load average: 0.20, 0.18, 0.12
# 從所有主機拉取 nmon 數據文件到當前目錄
parallel -a host.lst scp '"{}:/root/nmon/*160401*.nmon"' .
{} 會被替換為 host.lst 中的每一行 SSH 登入字串。
root@192.168.1.10:22
root@192.168.1.11:2222
user@host.example.com
需預先配置 SSH 免密鑰登入(ssh-copy-id),並建議在 ~/.ssh/config 統一設定 ControlMaster auto 多路複用加速連接建立。
'echo "..."' 或轉義 \" 避免本地 Shell 先行展開-j0 可能擊垮跳板機或目標主機 MaxStartups,建議 -j 50 限制並發timeout 命令防止卡死:parallel --nonall -j0 --slf host.lst "timeout 10 cmd"GNU Parallel 以極簡語法解決「在 N 台機器上跑同一條命令」的 80% 場景,是運維工程師工具箱裡的瑞士軍刀。