私は、協力して正常に終了しない Java プロセスに数回噛まれました (制御できない低レベルのライブラリに埋もれてしまいます)。私は現在、事前に確立された時間でプロセスのハードストップを実装する一種のウォッチドッグをテストしていますScheduledStop
. そのウォッチドッグは、スケジュールされた停止時間になるとプロセス全体を強制終了する独立したスレッドを実行するシングルトン クラスです。通常、すべてのスレッドはハードストップ時間の前に適切に戻り、プログラムは正常に終了します。ただし、必要に応じてプロセス自体を強制終了したり、ファイル ロックを解除したりします。これらはすべて Linux で実行されます。
私はそれが絶対確実ではないことを覚えているようですSystem.exit(0)
(いくつかのシャットダウンフックがスタックしている場合、プロセスは生き続ける可能性があると思います)ので、次の行に沿って何かを作成しました:
int pid = MyUtil.getPID();
Runtime.getRuntime().exec(new String[]{"kill", "-9", String.valueOf(pid)});
ここで、実際には非協調的なスレッドをいくつか使用してテストしたいと思います。また、テストのために意図的にうまく機能していないシャットダウン フックを使用することもできます。
以下の最初の NastyThread はそれほど厄介ではありません... を無視しますInterruptionException
が、防止しませんSystem.exit(0)
。exit()
VM を終了しない状態にするにはどうすればよいですか?
もう 1 つの質問は、ウォッチドッグ スレッドは理論的には独立していますが、他のスレッドがそれを完全にプリエンプトし、スケジュールされた停止を失敗させる条件は何ですか?
必要に応じて、特定の時間に親 (Java プロセス) を強制終了する別のプロセス (単純な perl スクリプトなど) を起動できます。
/**
* A Runnable that runs forever and ignores InterruptedException.
*/
private static class NastyThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println("Received and ignoring "+e);
System.out.flush();
}
System.out.println(ScheduledStop.getInstance().toString());
}
}
}