JavaでJNIを使用せずにkillシグナルをキャプチャする最良の方法は何ですか。Sun.misc.SignalとSun.misc.SignalHandlerが検出され、削除される可能性があるという警告が表示されました将来のリリースで。
JNIを使用してc libを呼び出すのは私が持っている唯一のオプションですか?
これを処理する方法は、 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にのみ存在します。
少なくともJava 6であるため、HotSpot Java
コマンドには-Xrs
フラグは、JVMシグナルハンドラを無効にします。
使用する場合は、System.exit()
を明示的に呼び出すものを含め、独自のSIGINT
、SIGTERM
、SIGHUP
、およびSIGQUIT
ハンドラーを実装する必要があります。
注:これは、SIGQUITのスレッドダンプ機能が-Xrs
フラグが存在します。
https://docs.Oracle.com/javase/8/docs/technotes/tools/unix/Java.html#BABHDABI を参照してください(WindowsおよびSolarisのJava
の対応製品でも利用可能)。
HotSpot JVMがシグナルチェーンを行う機能を説明する シグナルと例外処理の統合 を見てください。ただし、Cレベルの細工が必要です。
Java.lang.Runtime.addShutdownHook(Thread)
で十分ではないでしょうか?これらのフックは、JVMが実行できる限り、SIGINT
の受信を含め、終了時にJVMによって実行されます。