2011-05-13 55 views
7

別の(Python)プログラムをプロセスとして実行するJavaプログラムがあります。プログラムが終了すると `exec`でプロセスを終了する

Process p = Runtime.getRuntime().exec("program.py", envp); 

Javaプログラムが処理を終了すると、Python処理も終了します。 finishコマンドは、Pythonプロセスにシグナルを送信して閉じます。

プロセスがこのように閉じられている通常の状況で:

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
output.write("@EOF\n"); 
output.flush(); 

しかし、Javaプログラムがクラッシュし、プロセスが閉じていません。クローズコマンドは、クラッシュのために送信されません。プログラムが終了するたびにプロセスを自動的に終了することは可能ですか?

+0

私は実際にこの質問の答えにも本当に興味があります。私はそれを提供することはできませんが、なぜJavaプログラムがクラッシュしているのか分かち合いますか? – Vinay

+1

この質問に答えるには、詳細を提供する必要があります。たとえば、JavaプログラムとPythonプログラムのどちらかまたは両方のソースを自由に変更できますか? –

+0

私はVinay(haha同名)に同意しなければならないでしょう。私は実際にそれを探していますが、現在のJava Process IDが実行されている間だけPython Processを実行する行に沿った何かが、このトリックを行うと思います。私が正しい道にいるかどうかは確かではありませんが、この質問は本当に興味をそそられます。 – Vinay

答えて

2

あなたがクラッシュすると、Javaプログラムが例外をスローすることを意味すると、私はPythonプロセスを終了させるだけです。私はあなたのコードを見なくています。プログラムを引き起こす唯一の例外は、doStuff()から脱出をクラッシュさせる場合には、このような

class Foo { 

    Process p; 

    private void doStuff() throws Exception { 
     p = Runtime.getRuntime().exec("program.py", envp); 
     // More code ... 
    } 

    private void startStuff() { 
     try { 
      doStuff(); 
     } catch (Exception e) { 
      p.destroy(); 
     } 
    } 

    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     foo.startStuff(); 
    } 
} 

何かが動作するはずです。

終了時にプログラムがこのようにクラッシュすることを期待していないとしても、このアプローチは、おそらくPythonプロセスを殺すシェルスクリプトでラップするよりも優れていると思います。あなたのプログラムでそれを扱うのはそれほど複雑ではなく、あなたが知らないバグがまだ残っている可能性があるので、プログラムが終了したらコードを保持することは良い考えです。

+0

これは完璧な解決策ではありませんが、私の場合はこのパターンで十分です。 – czuk

3

こんにちは@czukはShutdownHookフックになりますか?これは

Java仮想マシンは、2種類のイベントに応答してシャットダウンし、次のようなシナリオに対処します:

  • プログラムが正常に終了し、最後の非デーモンスレッドが終了または終了(

  • 仮想マシンは、^ Cと入力するなどのユーザー割り込みや、ユーザーログオフやシステムシャットダウンなどのシステム全体のイベントに応答して終了します。

システムが予期せずクラッシュすると、これをキャプチャするのが簡単ではありません。

おそらくThread.setDefaultUncaughtExceptionHandlerメソッドを使用しますか?

+2

"シャットダウンフックも作業をすばやく完了する必要がありますプログラムが終了を呼び出すと、仮想マシンが即座にシャットダウンして終了することが想定されます。シャットダウンと終了に一定の時間がかかるため、ユーザーの操作を試みたり、シャットダウンフックで長時間の計算を実行することはお勧めできません。 Pythonプロセスを強制終了するのに時間がかかりません。 OPのための完璧なソリューション(と私の興味を失う)のようだ。 :) – Vinay

関連する問題