使用 shell 腳本在多個伺服器上並行執行命令

使用 shell 腳本在多個伺服器上並行執行命令

我有數千台遠端機器。我想對所有這些命令運行一些特定的命令,但是並行的。我使用這些按順序運行的命令:

for f in `cat host.lst`
do
       ./runScript.sh $f
done

假設host.lst包含 100 個主機。我想runScript.sh在 100 台主機上並行運行。此外,也應該維護日誌。

我無法在我的電腦上安裝任何實用程序,例如PSSH.

我做了很多研究並找到了這些鏈接,但它們沒有幫助。我不明白它們是如何運作的:

在許多伺服器上透過 SSH 自動運行命令

對匹配模式的多個文件並行執行命令

誰能解釋一下其中的邏輯嗎?

答案1

logdir=`mktemp -d`
bunch=200

IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
   IFS=" ";
   for host in $hosts; do
      ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
   done
   wait
done

假設檔案中一行/行列出了 1000 個(數千個)主機hosts.lst,然後一次從這些主機中選擇了一組(200 個),並且在這 200 個主機中的每一個上都產生了您runScript.sh使用的主機sshbatch mode同時保留了從每個後台作業中湧出到目錄中stdout+stderr名為 的檔案中,可以在需要時檢查該檔案。host$logdir

最後,我們透過wait內循環末尾的命令等待一組結束,然後再啟動下一組for

答案2

對腳本的以下修改不需要任何其他實用程序,將並行執行,但可能會遇到限制,具體取決於主機開啟檔案句柄的限制:

for f in $(cat host.lst); do
       ./runScript.sh $f &
done

要將結果捕獲到日誌中,只需添加> run.logdone即可保存到新文件run.log.

關鍵的變化是添加了&,它在後台運行一個進程,而不是等待它完成後再執行下一個命令。

相關內容