首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

GNU Parallel 實戰:叢集批量管理、文件分發與輸出標記

     編輯:PHP 相關知識

為什麼選擇 GNU Parallel?

面對數十上百台伺服器的批量命令執行、文件收集、配置下發,傳統 for 迴圈串行太慢,pssh/ansible 又顯重裝。GNU Parallel 單機無依賴、參數化強、支援 --nonall 無輸入流模式,是輕量級叢集操作的利器。

核心參數速查

參數說明
--nonall無標準輸入流,直接在 --slf 指定的所有主機執行命令
-j0最大並行度(不限制職位數)
--slf host.lst從文件讀取 SSH 登入字串列表(格式:user@host:port)
--tag輸出行前綴標記:有輸入流時為參數值,--nonall 時為 SSH 登入字串
-a file從文件讀取參數列表(非 --nonall 模式)

高頻實戰場景

1. 批量檢視/設置 Crontab

# 檢視所有主機 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'

2. 輸出帶標記,便於事後歸檔分析

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

3. 並行收集遠端文件

# 從所有主機拉取 nmon 數據文件到當前目錄
parallel -a host.lst scp '"{}:/root/nmon/*160401*.nmon"' .

{} 會被替換為 host.lst 中的每一行 SSH 登入字串。

host.lst 格式範例

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% 場景,是運維工程師工具箱裡的瑞士軍刀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved