2012-02-23 18 views
4

)(参加に永遠にハングアップ、私はそれがこの方法を使用してください:SSHJ私はSSHJを使用して、いくつかのコマンドを実行

private Command executeCommand(String command, SSHClient client) { 
    Command commandObject = client.startSession().exec(command); 
    commandObject.join(); 
    return commandObject; 
    } 

私は、このコマンドを実行するまで、それがうまく機能:この場合

cd $SOLR; nohup java -Dsolr.solr.home=./solr -DSTOP.PORT=8079 -DSTOP.KEY=stopkey -jar start.jar 2> logs/solr.log & 

プログラム全体がハングアップする

commandObject.join(); 

もちろん、起動するプロセスが開始されます。また、シェルから実行された同じ行がすぐに戻ります。

これを克服する理由と方法は何ですか?

編集:私は(参加)が、(コモンズ-IOで)コマンドのSYSOUTを読んでいないとき 同じことが起こります:

IOUtils.toString(commandObject.getInputStream())) 
+0

stdinとstderrをリダイレクトすることが考えられるので、最後のアンパサンドの前に '2>&1'を置くと助けになるかもしれません。しかし、私は別のコマンドで同様の問題を抱えているので、おそらくそれを完全に解決するわけではありません。 – bstempi

+0

私のコメントに対する訂正:それは役に立たない。あなたが特に指定しなければ、nohupはリダイレクトするだろう。私はこのlibにいくつかのスレッディング問題があることに気づいた。おそらくあなたは1つを遭遇しましたか? – bstempi

+0

@ilfrin、 'commandObject.join()'をタイムアウトなしで呼び出すため、メインスレッドがブロックされます。これは、現在のスレッドが通知を待つのをブロックします。呼び出されたプログラムがハングアップすると、メインスレッドもハングします。 – Boyan

答えて

2

おそらくあなたが実行しているJavaアプリケーションがデーモンです? (または、少なくとも終了する前に長い時間待つ)

SSHクライアントに依存して正しいシーケンスを送信するのではなく、デーモンの初期化/シャットダウンを制御する専用のスクリプトを使用する方がよい場合がありますコマンドの。このようにして、スクリプトはデーモンを制御する必要のあるデーモンやその他のアプリケーションをきれいに開始および停止するのに必要なすべてのものをカプセル化します。ログを記録する場所の詳細や起動に必要なjavaコマンドどのようにプロセスをバックグラウンド化するかなどを指定することができます。

独自のinitスタイルのスクリプトをロールバックするか、またはTanuki's Java Service Wrapper(またはそれに類するもの)を使用することができます。

0

私は同じ問題がありました。

joinを使用するたびにタイムアウトを設定して、スレッドが永久にロックされないようにすることをお勧めします。複数のコマンドを使用するための私の場合は、Shellインスタンスを初期化し、そして、例えばこのような何かをするだろう:

try 
{ 
      shell = session.startShell(); 
} 
catch (Exception e) 
{ 
      // failed to open 
      return; 
} 
outputStream = shell.getOutputStream(); 
outputStream.write(Strings.toUTF8ByteArray("some fast command\n")); 
outputStream.flush(); 
try { shell.join(1, TimeUnit.SECONDS); } 
catch (Exception e) {} 
outputStream.write(Strings.toUTF8ByteArray("some complex command\n")); 
outputStream.flush(); 
try { shell.join(30, TimeUnit.SECONDS); } 
catch (Exception e) {} 

は、それは誰もがいくつかの同様の問題を持つために有用である可能性がある願っています。

関連する問題