2009-05-14 28 views
1

実行するシェルスクリプトを含むデータベースのテーブルを監視するスレッドで構成されるJavaアプリケーションがあります。私は数秒ごとにデータベースを調べます。スクリプトの場合はProcessクラスを使用して実行し、テーブル内の別のスクリプトを待機します。Javaアプリケーションからシェルスクリプトを独立して実行する

私の問題は次のとおりです。時には、スクリプトの一部のコマンドが失敗することがあります。スレッドはエラーストリームをキャプチャし、データベースに記録します。ただし、メッセージのロギングは続行され、データベース内の後続のシェルスクリプトを実行できないため、スクリプトからJavaスレッドに制御が返されません。

回避策はありますか?

+0

エラー状態を検出してprocess.destroy()を呼び出す方法はありますか? –

答えて

3

あなたはの両方を公開しています標準出力標準エラー?別のスレッドでこれをやっていますか?スクリプト出力をどのように消費しているかによって、どちらか一方をブロックすることが可能です。親プロセスがその出力を消費するのを待って、スクリプトがブロックされているのを察知しています。 Processドキュメントから

いくつかのネイティブなプラットフォームには標準入出力ストリームのための限られたバッファサイズを提供するので、速やかにサブプロセスの出力ストリームを入力ストリームの書き込みまたは読み取りに失敗すると、サブプロセスを引き起こす可能性がありブロックする、さらにはデッドロックする

this questionを参照し、「ストリームゴブラー」を参照するサンプルコードを参照してください。 2インチゴブラーが作成され、標準出力と標準エラーを消費します。

+0

私は両方のストリームを同じスレッドで読み込み、それを記録しています。エラーを発生させずに、ブロッキングモードから抜け出す方法を探したいだけです。 – Epitaph

+1

出力/エラーストリームを消費し続け、exec()がブロックされないようにするには、*別のスレッドで*読み込む必要があります。私はあなたがエラーに遭遇したときにそれが消費されていないので(stderr?)ストリームブロックの1つが疑わしいので、ブロックします。 –

関連する問題