4

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();

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

これを克服する理由と方法はありますか?

編集: join() を実行せずにコマンドの sysout を読み取ると、同じことが起こります (commons-io を使用):

IOUtils.toString(commandObject.getInputStream()))
4

2 に答える 2

2

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

正しいコマンド シーケンスの送信を SSH クライアントに依存するよりも、デーモンの初期化/シャットダウンを制御する専用のスクリプトをターゲット マシンに用意する方がよい場合があります。このように、スクリプトは、デーモンとそれを制御する必要がある他のアプリをクリーンに開始および停止するために必要なすべてのものをカプセル化します。このスクリプトを呼び出して開始および停止するだけで、どこにログを記録するか、開始に必要な Java コマンドについての詳細を知る必要はありません。 、プロセスをバックグラウンドで実行する方法など。

これには、独自の init スタイル スクリプトを作成するか、Tanuki の Java Service Wrapper (または類似のもの) を使用できます。

于 2012-08-21T10:37:34.077 に答える