頑張らないように頑張る。

努力と怠惰の狭間

【Qiita】Javaでシグナルを検知して処理する。

Qiitaにもまとめました。

Javaでシグナルを検知して処理する。


ある日

上司「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