最近、シェルスクリプトでこれに遭遇しました。
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
kill -0 ...
は何をしますか?
kill -0
(またはより移植性の高いPOSIXバリアントkill -s 0
)は、信号を送信する動きをしますが、実際には信号を送信しません。 Shellコマンド が単純な方法で公開するのは 基になるC API の機能です。
kill -s 0 -- "$pid"
は、指定されたPID($pid
が負の場合はPGID)で実行中のプロセスがあるかどうか、および現在のプロセスがそれを送信する権限を持っているかどうかをテストします(プロセス内の任意のプロセス)負の場合はグループ$pid
)信号。これは主に、プロセス(またはプロセスグループ)が生きているかどうかをテストする方法です。
予想されるPIDとアクセス許可を持つ実行中のプロセスがある場合でも、これは必ずしも予想されるプロセスではないことに注意してください。予期したプロセスが早期に終了し、そのPIDが関連のないプロセスに再利用された可能性があります。プロセスを監視する正しい方法は、親にそれを実行させることです—プロセスのPIDは、親がその死を認めるまで再利用されません(そのため zombies が存在するため)、プロセスの親は確実に子を識別できます彼らのPIDによって。
kill -0 $pid
は、$pid
が存在します。
スニペットで
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
ブロック ... do something ...
に格納されているPIDを持つプロセスが/path/to/file.pid
が実行されている-および-スニペットがrootとして実行されない限り-PIDが同じユーザーで実行されている場合。
POSIX標準では、0
信号:
Sigが0(ヌル信号)の場合、エラーチェックは実行されますが、実際には信号は送信されません。 null信号は、pidの有効性をチェックするために使用できます。
( kill(3p) 、POSIX.1-2008-POSIX.1-2001の同様の表現)
POSIXは両方のkill -0
およびkill -s 0
コマンドラインスタイル( kill(1p) )。
Kill syscallインターフェースとは対照的に、kill
コマンドを使用して、他のユーザー(通常のユーザーとして)が所有するPIDの存在を確実に確認することはできません。例:
$ kill -0 123
kill: kill 123 failed: no such process
$ echo $?
1
vs.
$ kill -0 1
kill: kill 1 failed: operation not permitted
$ echo $?
1
Kill syscallを呼び出すと、errno
の値を確認することで、これらのケースを確実に区別できます(例: Pythonの例 を参照)。