Perl日記

PerlとかRubyとかPHPとかPythonとか

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」叩き込んで(叩き込まないで)、プロセスの生存確認をしているということのようだ。
さすが死活監視ツールである。