web-dev-qa-db-ja.com

Java

JavaでJNIを使​​用せずにkillシグナルをキャプチャする最良の方法は何ですか。Sun.misc.SignalとSun.misc.SignalHandlerが検出され、削除される可能性があるという警告が表示されました将来のリリースで。

JNIを使​​用してc libを呼び出すのは私が持っている唯一のオプションですか?

39
Begui

これを処理する方法は、 shutdown フックを登録することです。 ([〜#〜] sigint [〜#〜])を使用する場合、kill -2はプログラムを正常に終了し、シャットダウンフックを実行します。

新しい仮想マシンのシャットダウンフックを登録します。

Java仮想マシンは、次の2種類のイベントに応答してシャットダウンします。

  • 最後の非デーモンスレッドが終了するか、exit(同等にSystem.exit)メソッドが呼び出されると、プログラムは正常に終了します。

  • 仮想マシンは、^ Cの入力などのユーザー割り込み、またはユーザーログオフやシステムシャットダウンなどのシステム全体のイベントに応答して終了します。

OSX 10.6.3とkill -9で次のテストプログラムを試してみました[〜#〜] [〜#〜]シャットダウンフックを実行しませんでしたtだと思います。 kill -15 it[〜#〜]で[〜#〜]毎にシャットダウンフックを実行します。

public class TestShutdownHook
{
    public static void main(final String[] args) throws InterruptedException
    {
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                System.out.println("Shutdown hook ran!");
            }
        });

        while (true)
        {
            Thread.sleep(1000);
        }
    }
}

これは、Javaのシャットダウンフックではない、独自の シグナルハンドラ を記述するための文書化された方法です。 Be 警告com.Sun.miscパッケージおよびはサポートされておらず、いつでも変更または廃止される可能性があり、おそらくSun JVMにのみ存在します。

58
user177800

少なくともJava 6であるため、HotSpot Javaコマンドには-Xrsフラグは、JVMシグナルハンドラを無効にします。

使用する場合は、System.exit()を明示的に呼び出すものを含め、独自のSIGINTSIGTERMSIGHUP、およびSIGQUITハンドラーを実装する必要があります。

注:これは、SIGQUITのスレッドダンプ機能が-Xrsフラグが存在します。

https://docs.Oracle.com/javase/8/docs/technotes/tools/unix/Java.html#BABHDABI を参照してください(WindowsおよびSolarisのJavaの対応製品でも利用可能)。

5
delitescere

HotSpot JVMがシグナルチェーンを行う機能を説明する シグナルと例外処理の統合 を見てください。ただし、Cレベルの細工が必要です。

Java.lang.Runtime.addShutdownHook(Thread)で十分ではないでしょうか?これらのフックは、JVMが実行できる限り、SIGINTの受信を含め、終了時にJVMによって実行されます。

4