15

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

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

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

私のプログラムがクラッシュした場合(まだ開発中です:-))、子プロセスはまだぶらぶらしているようです親のJavaプロセスが終了したときに自動的に終了させるにはどうすればよいですか?

役に立ったら、私は Mac OS X 10.5 を使用しています

4

3 に答える 3

10

あなたが言ったように、addShutdownHookは行く方法です。

しかし:

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

  • 一部の標準ライブラリには、自分の前に実行される可能性のある独自のフックがあります。

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

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

于 2008-11-04T07:34:33.020 に答える
10

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

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));
于 2008-11-04T07:17:41.917 に答える