Javaアプリが終了/クラッシュしたときにJava子プロセスを削除するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/261125

質問

次のようにJavaで子プロセスを起動します。

final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);

バックグラウンドで実行されるようになりました。すべて順調です。

プログラムがクラッシュした場合( はまだdevにあります:-))、子プロセスはまだハングアップしているようです。親Javaプロセスが終了したときに自動的に終了させるにはどうすればよいですか?

解決したら、Mac OS X 10.5を使用しています

役に立ちましたか?

解決

おっしゃるように、 addShutdownHook が方法です。

しかし:

  • プログラムが終了した場合にシャットダウンフックが実行されるという保証はありません。誰かがJavaプロセスを強制終了する可能性があり、その場合、シャットダウンフックは実行されません。 (この SOの質問で述べたように)

  • 一部の標準ライブラリには独自のフックがあり、これは自分の前に実行できます。

  • デッドロックに注意してください。

別の可能性は、 Javaプログラムをサービスにラップすることです。

他のヒント

すでに自分で解決しました。次のように、シャットダウンフックを追加します。

final String[] cmd = {"<childProcessName>"};
final Process process = Runtime.getRuntime().exec(cmd);
Runnable runnable = new Runnable() {
    public void run() {
        process.destroy();
    }
};
Runtime.getRuntime().addShutdownHook(new Thread(runnable));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top