ホームページ >Java >&#&チュートリアル >Java は SIGKILL シグナルを処理できますか? 正常なシャットダウンの代替手段は何ですか?

Java は SIGKILL シグナルを処理できますか? 正常なシャットダウンの代替手段は何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-06 02:41:09740ブラウズ

Can Java Handle SIGKILL Signals, and What's the Alternative for Graceful Shutdown?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。