我有數千台遠端機器。我想對所有這些命令運行一些特定的命令,但是並行的。我使用這些按順序運行的命令:
for f in `cat host.lst`
do
./runScript.sh $f
done
假設host.lst
包含 100 個主機。我想runScript.sh
在 100 台主機上並行運行。此外,也應該維護日誌。
我無法在我的電腦上安裝任何實用程序,例如PSSH
.
我做了很多研究並找到了這些鏈接,但它們沒有幫助。我不明白它們是如何運作的:
誰能解釋一下其中的邏輯嗎?
答案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
使用的主機ssh
,batch mode
同時保留了從每個後台作業中湧出到目錄中stdout+stderr
名為 的檔案中,可以在需要時檢查該檔案。host
$logdir
最後,我們透過wait
內循環末尾的命令等待一組結束,然後再啟動下一組for
。
答案2
對腳本的以下修改不需要任何其他實用程序,將並行執行,但可能會遇到限制,具體取決於主機開啟檔案句柄的限制:
for f in $(cat host.lst); do
./runScript.sh $f &
done
要將結果捕獲到日誌中,只需添加> run.log
後done
即可保存到新文件run.log
.
關鍵的變化是添加了&
,它在後台運行一個進程,而不是等待它完成後再執行下一個命令。