2012-10-01 78 views
1

我的情況是,我有許多進程應該在不同的遠程主機中同時啓動(或多或少)。產生所有遠程進程的主腳本應等待所有這些進程完成,然後才能繼續進行下一次分佈式執行。到目前爲止,我已經試過這樣的方式(與Ubuntu 12.04服務器上沒有成功,/ bin/sh的指向爲/ bin/bash)的是:如何等待多個遠程進程(通過ssh)完成?

#!/bin/bash 

for run_input in run1.data run2.data ; do 
    for i in `seq 0 10` ; do 
     ssh node$i "/path/to/bin $run_input /path/to/node$i.config" & 
    done 
    wait 
done 

那麼,什麼是錯用上面的辦法?

編輯:

注意,該命令是對每個遠程主機不同。

回答

3

只是回答我的問題,有什麼錯我這樣做的方式(儘管有些人可能會推薦pssh或類似的東西來代替)。按照我在問題中提出的方式,對於發送的每個命令,都會使用遠程主機創建一個臨時ssh會話。這個ssh會話仍然在後臺運行,通過簡單地調用wait,腳本應該暫停,直到完成所有後臺子進程 - 在這種情況下,ssh會話。

我在做什麼錯是,我是管道中的文件移到while循環,如:

cat file.txt | while read line ; do 
    ssh node "do_something_with $line" & 
done 
wait 

上述的問題是,管道成while循環時,子殼創建的,因此創建的遠程ssh會話不是此腳本的子節點,而是子shell的子節點。因此,撥打wait毫無效果。

1

對於在同一時間運行並行的ssh,我建議使用pssh

文件有:http://www.theether.org/pssh/docs/0.2.3/pssh-HOWTO.html

然後:

pssh -h /PATH/TO/FILE/WITH/HOSTS command 
+0

好,那麼你如何發送不同的命令到不同的目的地? –

+0

你應該在每行上填寫'/ PATH/TO/FILE/WITH/HOSTS'文件;那麼'pssh -h file command1;命令2; ...' –