1

私のスクリプトは次のとおりです。

for i in $(seq $nb_lignes) a list of machines
do
ssh root@$machine -x "java ....." 
sleep 10
done

--> マシン C からこのスクリプトを実行します

私は 2 台のマシン A と B を持っています ($nb_lignes=2)

ssh root@$machineA -x "java ....." : create a node with Pastry overlay 
wait 10 secondes
ssh root@$machineB -x "java .....":create another node join the first (that's way i     have use sleep 10 secondes)

マシン C からスクリプトを実行します。次のように表示します。ノード 1 が作成されました。10 秒待って、ノード 2 が作成されたことを表示します。

私の問題:ノード1のみが作成されていると表示されます

i tape ctrl+c ノード 2 が作成されたことを表示します

PS: 2 つのプロセス java は、マシン A と B でまだ実行されています。

ありがとうございました

4

2 に答える 2

2

私がこれを読んでいる限り、アルマーニは正しいです。Java プログラムは終了しないため、ループの 2 回目の繰り返しは、最初の繰り返しを「中断」するまで実行されません。Java プログラムは、ssh から送信されたブレーク信号を無視していると思います。

各 SSH を でバックグラウンド化するよりも&、ssh 自体が提供するツールを使用した方がよいでしょう。ssh の man ページから:

 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

したがって...スクリプトは次のようになります。

for host in machineA machineB; do
    ssh -x -f root@${host} "java ....." 
    sleep 10
done
于 2012-10-10T23:37:40.810 に答える
1

「ssh」コマンドの後に「&」文字を試してください。これにより、プロセスが個別に生成され[バックグラウンド]、スクリプトが続行されます。

そうしないと、スクリプトがsshの実行でスタックします。

編集:明確にするために、これはあなたのスクリプトになります:

for i in $(seq $nb_lignes) a list of machines
do
ssh root@$machine -x "java ....." &
sleep 10
done
于 2012-10-10T19:34:16.257 に答える