【Qiita】Javaでシグナルを検知して処理する。
Qiitaにもまとめました。
ある日
上司「Javaで、SIGINT検知して、任意の処理して、処理継続できるようにして」
僕「はい」
僕「分からんからとりあえず調べよう。」
ネット「Signal/SignalHandlerがあるよ」
僕「ええやん」
Oracle「Java9から非サポートになります」
僕「マジかよ」
ネット「Runtime.addShutdownHook()があるよ」
僕「シグナルの検知できるの?」
ネット「出来ないよ」
僕「何やねん」
ネット「しかもそのままスレッド閉じちゃうから処理継続できないよ」
僕「何やねんpart2」
次の日
僕「って状況なんですけど、どうしましょう。別の方法考えましょうか」
上司「非サポートなだけなら使えるでしょ」
僕「え、使っていいんですか」
上司「いいよ」
僕「(良いんだ...)」
SIGINTとは、
Linuxに送るシグナルの一種。
シグナルとは、OSに対して送る信号。(そのまま)
例えば、プログラム実行中にCtrl+Cで中断できるが、この時OSに対してSIGINTが送信されている。
http://linuxjm.osdn.jp/html/LDP_man-pages/man7/signal.7.html
http://capm-network.com/?tag=UNIX%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%E4%B8%80%E8%A6%A7
https://www.xmisao.com/2013/11/10/linux-kill-signals.html
Signal/SignalHandlerとは
そんなシグナルを、Java側で検知できるAPI。
Oracleのブログを見てみると、
「sun* APIは、非サポートだから使用しないように。
ただ、sun.misc {Signal、SignalHandler}は残る事が "提案" されているよ。」
との事なので、実際に残るかどうかはまだ分からない。
https://blogs.oracle.com/java/get-ready-jdk9
Runtime.addShutdownHook()とは
JVMがシャットダウンされた時に動作する。
非サポートとは
例えば、こんな時に非推奨認定されるらしい。
- 安全でない、バグが多く、非常に非効率的である
- 将来のリリースで廃止される
- 不適切な手法でのコーディングにつながる
https://docs.oracle.com/javase/jp/1.5.0/guide/javadoc/deprecation/deprecation.html