2014-04-06 32 views
2

我有一個腳本循環訪問主機列表,通過SSH使用RSA密鑰連接每個主機,然後將輸出保存到本地計算機上的文件 - 這一切都可以正常運行。但是,要在每臺服務器上運行的命令需要一段時間(約30分鐘),並且有10臺服務器。我想並行運行這些命令以節省時間,但似乎無法使其工作。這裏是代碼,因爲它是現在(工作):同時向多個主機發送SSH

for host in $HOSTS; do 
    echo "Connecting to $host".. 
    ssh -n -t -t [email protected]$host "/data/reports/formatted_report.sh" 
done 

我該如何加快速度?

+1

看看[parallel ssh](https://code.google.com/p/parallel-ssh/)和[mass parallel ssh](http://sourceforge.net/projects/mpssh/),僅舉幾個項目。 – chepner

回答

2

我試着用&到SSH命令發送到後臺,但我放棄了這個,因爲SSH命令完成後,腳本的輸出文件,這就需要已經創建執行一些命令。

使用&使腳本直接跳到那些由於輸出文件尚未存在而失敗的命令。但後來我瞭解到等待命令等待後臺命令完成,然後繼續。現在這是我的代碼,它的工作原理:

for host in $HOSTS; do 
    echo "Connecting to $host".. 
    ssh -n -t -t [email protected]$host "/data/reports/formatted_report.sh" & 
done 
wait 
5

你應該添加&到ssh調用的結尾,它會在後臺運行。

for host in $HOSTS; do 
    echo "Connecting to $host".. 
    ssh -n -t -t [email protected]$host "/data/reports/formatted_report.sh" & 
done 
+0

謝謝,我已經試過這個,但它接近答案(看我發佈的內容)作爲答案 – user3502260

0

Hypertable項目最近添加了一個多主機ssh工具。該工具使用libssh構建,並建立連接併發出異步命令並行以獲得最大並行性。有關完整的文檔,請參見Multi-Host SSH Tool。要在一組主機的運行命令,你可以按如下方式運行:

$ ht ssh host00,host01,host02 /data/reports/formatted_report.sh 

你也可以指定主機名或IP地址格式,例如:

$ ht ssh 192.168.17.[1-99] /data/reports/formatted_report.sh 
$ ht ssh host[00-99] /data/reports/formatted_report.sh 

它還支持--random-start-delay <millis>選項,該選項將延遲每個主機上的命令開始的時間間隔爲0和<millis>毫秒之間的隨機時間間隔。當運行的命令訪問中央資源時,可以使用此選項來避免雷鳴羣體問題。

相關問題