質問: `kill -0` という手段を初めて知ったので、`kill -0` の用途を質問させてください。 kill の man には以下のように書かれています。 > > sig に 0 を指定した場合、シグナルは送られないが、 エラーのチェックは行われる。これを使って、プロセス ID や プロセスグループ ID の存在確認を行うことができる。 > > > プロセスを制御する手段として、おなじみなのは、PID をファイルに保存しておき、プロセスを終了させたいときは PID ファイルの中身の PID を指定して kill するというものです。 たとえばプロセス foobar を以下のように起動させて ``` foobar & echo $! > foobar.pid ``` 終了させるとき ``` kill -9 $(cat foobar.pid) ``` ここではシグナル 9 を送信( `kill -9` )していますが、冒頭に引用したように、シグナル 0 を送信( `kill -0` )することもできるようです。 `kill -0` の用途としては、以下のような理解であっているでしょうか? プロセス foobar の状態と foobar.pid ファイルの存在有無は関係が無い。つまり、foobar.pid ファイルが存在していたとしても、それがプロセス foobar が走っているという保証にはならない。ゆえに、プロセス foobar の状態を確認するために kill -0 を用いる。
回答: おおむね、その理解でよろしいかと存じますが、少し指摘をさせていただきます。 まず、プロセスIDは使い回される場合があり、通常はインクリメントで増えていきますが、 `/proc/sys/kernel/pid_max` で定義される最大値を超えるとこれまでに使ったプロセスIDを利用した別のプロセスが実行される場合が有り、pidファイルに記載されたプロセスが走っている保証にはなりません。 また、sig 0についてですが、kill from util-linux 2.33.1 の`man 2 kill` によると、以下のとおりになり、記載された内容とは異なります。 > > If sig is 0, then no signal is sent, but existence and permission checks are still performed; this can be used to check for the existence of a process ID or process group ID that the caller is permitted to signal. > > > sig に 0 を指定した場合、シグナルは送られないが、 プロセスの存在と権限のチェックは行われる。これを使って、送信者がシグナルを送信できるプロセス ID や プロセスグループ ID の存在確認を行うことができる。 > > > という訳で、`kill` の権限があるかどうかの確認に使うことも可能そうです。