killでプロセスに「0」を送ると、プロセスの生存確認ができる
eyeのソースコードでkillで「0」を送っていた
eyeというプロセス監視ツールがある。
このツールの中身をみていたところ、以下のようなコードがあった。
https://github.com/kostya/eye/blob/f37de3761566e74bd04d3e20c6cdb7a67cbabd99/lib/eye/system.rb
# Check that pid really exits # very fast # return true/false def pid_alive?(pid) if pid ::Process.kill(0, pid) true end rescue false end
プロセスに「0」のシグナル番号をkillで送っている。
ご存知の通り、「9」ならSIGKILLだし、「15」ならSIGTERMだけど、「0」ってなに?、と思って調べたメモ。
意味
先に結果から書くと、「プロセスの生存確認」ということだった。
メモ
kill(1)のmanにはなかったし、-lでも出てこなかった。
$ man kill
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE 9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG 17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD 21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGINFO 30) SIGUSR1 31) SIGUSR2
と思ったら、macのmanにはなかったけど、Linuxのmanにはあった。
If sig is 0, then no signal is sent, but error checking is still performed.
もしシグナルが0なら、シグナルは送られないが、エラーチェックは実行されます。
なるほど。
(macで)やってみると、確かにそんな感じになった。
# プロセスがあるとき $ ps 723 PID TT STAT TIME COMMAND 723 ?? R 13:39.12 /Applications/Firefox.app/Contents/MacOS/firefox $ kill -0 723 $ echo $? 0 $ ps 723 PID TT STAT TIME COMMAND 723 ?? S 13:43.44 /Applications/Firefox.app/Contents/MacOS/firefox # プロセスがないとき $ kill -0 63421 -bash: kill: (63421) - No such process $ echo $? 1
というわけで、プロセスIDを書き込んでおいた「/var/run/xxx.pidファイル」があっても、そのプロセスが生きているかどうかをチェックするために、killを使って「0」叩き込んで(叩き込まないで)、プロセスの生存確認をしているということのようだ。
さすが死活監視ツールである。