2013-09-22 44 views
3

我需要在多臺Ubuntu-Linux服務器上並行執行應用程序,同時爲不同的服務器提供不同的參數。我試圖谷歌它,但無法得到可能的解決方案。我甚至嘗試過使用ssh/pdsh/parallel,但沒有成功。如何向具有不同參數的遠程節點發出並行命令?

爲了進一步解釋場景,下面是一個非工作示例(帶有pdsh),其中script.sh應該在所有3個服務器上並行執行,但具有不同的參數。僅供參考,我已經有公開/私人ssh-key(無密碼登錄)。

$的pdsh -w服務器1,服務器,服務器3 -l用戶名script.sh ARGS
其中ARGS應該是1 server1的,2服務器2等

我將不勝感激,如果有人可以幫助我實現這可以使用pdsh或Ubuntu中提供的其他工具。謝謝你的幫助。

問候
薩欽

+0

爲什麼不在背景中啓動三個不同的命令? – devnull

+0

難道不是意味着一個接一個地使用腳本運行三個pdsh命令(在後臺)嗎?我假定使用系統提供的方法可能在所有調用之間的時間滯後與爲相同工作創建的腳本相比較少。糾正我,如果我的假設是錯誤的。感謝您的快速答覆。 – Sachin

+0

是的,你的假設不是很正確。雖然在後臺發佈這三個請求並不會導致這些請求從相同的* exact *實例開始,但這些實例仍然會在所有實際目的的同一時間啓動。 – devnull

回答

1

我已經做了,在過去使用cssh類似的事情,但我不明白爲什麼pdsh不會以相同的方式工作(雖然我從來沒有使用過)。

我的假設是,您可以在所有系統上同時運行交互式會話您可以在每個會話中創建新的環境變量。如果pdsh不允許這樣,cssh確實是

在開始腳本之前,根據主機名設置一個環境變量。

ARG=$(case $(hostname) in server1) echo 1;; server2) echo 2;; server3) echo 3;; esac) 
script.sh $ARG 

假設你想在你的主機名進行編碼(如你的問題建議)的數量,可以將其簡化如下:

script.sh ${HOSTNAME#server} 
0

你不需要任何特殊的工具 - SSH和bash就足夠了。如果你想添加更多的服務器,你所需要做的就是將它們添加到頂部附近的陣列中。請小心以下示例代碼中的空格。如果您有多個參數,請使用多個參數數組。一個ssh配置文件允許每個主機用戶名。

`#!/bin/bash 
servers=(server1 server2 server3) 
args=(args1 args2 args3) 
count=${#servers[@]} 
k=0 
while ((k<count)) 
do 
    ssh -l username ${servers[k]} 'script ${args[k]}' & 
    ((k++)) 
done` 
相關問題