2

Java の ProcessBuilder クラスを使用して外部プロセスを実行しています。プロセスは、Java プログラムが終了する前に終了してはなりません。コマンド/応答モードで存続する必要があります。

プロセス ストリームは無視すると簡単に「ジャム」する可能性があることを知っているので、次のことを行いました。 プログラムは、プロセスの結合された出力ストリームとエラー ストリームを「リーダー」スレッドで読み取り、「ライター」スレッドを使用してコマンドを管理します。 . リーダー スレッドは、プロセス出力からの文字読み取りをブロックし、それらを文字列にバッファリングして、結果をディスパッチします。書き込みスレッドは、PrintWriter を介して完全な「コマンド」行を書き込みます。キューを使用して、2 つのコマンド書き込みが「近すぎ」(現在は 100 ミリ秒) ないようにし、前のコマンドの出力が完了する前に新しいコマンドが書き込まれないようにします。また、すべての println() の後に、flush() と checkError() を呼び出します。

このスキームは、数秒または数分間正常に機能し、その後、読み取りスレッドがブロッキング read() でハングします。エラーも例外もスローされず、プロセス出力もありません。その後、外部プロセスを復活させるものは何もありません(再起動する以外)。(ところで、これは Linux と Windows の両方で発生します。)

Jakarta Commons Exec と Plexus Utils http://plexus.codehaus.org/plexus-utils/のコードとテストケースを見てきましたが、(a) どちらも長寿命のプロセスを使用する例を示しておらず、( b) どちらも、私が説明したことと基本的に異なることをしているようには見えません。

ここで何が起こっているのか、誰にも分かりませんか?ありがとう!

4

3 に答える 3

1

エラー、入力、および出力ストリームを 3 つの個別のスレッドに実装しましたが、問題なく外部プロセスを読み書きできます。

多数の組み込みアプリ cmd/bash と他の cmd ライン バイナリを使用して Windows/Linux の両方でテストしましたが、io ストリーム例外がスローされる場合を除き、正常に動作します。例外をキャッチしてスレッドを再起動するだけです。そのプログラムが機能し続けるようにします。

たとえば、Linux で ssh を実行しようとしている場合、同じ stdin に書き込めないなどの問題に遭遇する可能性があります。これはセキュリティ上の理由によるものです。

System.in から入力を取得してみて、それが機能するかどうかを確認してください。私の場合は機能しました

于 2011-12-07T16:12:52.177 に答える
1

stderr を管理するスレッドもありますか? あなたは2つのストリームについてのみ言及しています。

于 2009-10-29T12:58:20.677 に答える
0

推測ですが、エラーストリームと出力ストリームの組み合わせを解除してみましたか?

于 2009-10-29T13:00:55.453 に答える