1

私の状況では、異なるリモートホストで同時に (多かれ少なかれ) 開始するはずのプロセスが多数あります。すべてのリモート プロセスを生成するマスター スクリプトは、すべてのリモート プロセスが終了するのを待ってから、次の分散実行に進む必要があります。私がこれまでに試した方法 (Ubuntu Server 12.04 では成功せず、/bin/sh は /bin/bash を指しています) は次のとおりです。

#!/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

では、上記のアプローチの何が問題になっているのでしょうか。

編集:

コマンドはリモート ホストごとに異なることに注意してください。

4

2 に答える 2

3

私自身の質問に答えるだけで、私が行っていた方法に問題はありません(ただし、代わりに pssh または同様のものを使用することをお勧めする人もいます)。質問で提案した方法では、コマンドが送信されるたびに、リモート ホストで一時的な ssh セッションが作成されます。この ssh セッションはバックグラウンドで実行されたままになり、 を呼び出すだけwaitで、スクリプトはすべてのバックグラウンドの子プロセス (この場合は ssh セッション) が終了するまで一時停止する必要があります。

私が間違っていたのは、次のようにファイルを while ループにパイプしていたことです。

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

上記の問題は、while ループにパイプするときにサブシェルが作成されるため、作成されるリモート ssh セッションはこのスクリプトの子ではなく、サブシェルの子であるということです。したがって、呼び出しwaitはまったく効果がありませんでした。

于 2012-11-07T19:52:34.870 に答える
1

並列 ssh を同時に実行するには、psshを使用することをお勧めします

ドキュメントがあります: http://www.theether.org/pssh/docs/0.2.3/pssh-HOWTO.html

それで :

pssh -h /PATH/TO/FILE/WITH/HOSTS command
于 2012-10-01T12:36:42.717 に答える