Java での SIGKILL シグナル処理
多くの場合、kill -9 コマンドに関連付けられている SIGKILL シグナルは、どのプログラムでも処理またはキャプチャできません。 Java またはその他の言語で。これは、応答しないプロセスや悪意のあるプロセスでも確実に終了できるようにする意図的な設計機能です。
SIGKILL は管理できないため、制御されたシャットダウン要求を表す SIGTERM シグナルの処理に焦点を移す必要があります。 Java には、プログラムが SIGTERM を受信するか正常に終了するときに実行されるシャットダウン フックを登録する Runtime.addShutdownHook() メソッドが用意されています。
シャットダウン フックの登録
登録するにはシャットダウンフック:
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { // Perform cleanup tasks System.out.println("Shutdown hook ran!"); } });
例プログラム
次のテスト プログラムは、OSX でのシャットダウン フックの使用を示します。
public class TestShutdownHook { public static void main(String[] args) throws InterruptedException { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.out.println("Shutdown hook ran!"); } }); while (true) { Thread.sleep(1000); } } }
このプログラムを kill -15 (SIGTERM) で実行すると、「Shutdown」が出力されます。フックが走った!」
kill -9 の処理
前述したように、kill -9 は適切に処理できません。ただし、ラッパー スクリプトまたはメイン アプリケーションを監視するウォッチャー プログラムを使用して回避策を実装できます。メイン アプリケーションが終了または終了すると、ウォッチャーはクリーンアップ タスクを実行したり、他のアプリケーションに通知したりできます。
ラッパー スクリプトの例
#!/usr/bin/env bash java TestShutdownHook wait # notify your other app that you quit echo "TestShutdownHook quit"
以上がJava は SIGKILL シグナルを処理できますか? 正常なシャットダウンの代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。