回答:
指定されたものにシグナル0
を送信することは、指定されたPID
プロセスPID
が実行されているかどうか、およびシグナルを送信する権限があるかどうかを確認するだけです。
詳細については、次のマンページを参照してください。
kill(1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
kill(2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed; this
can be used to check for the existence of a process ID or process group ID.
...
man 2 kill
代わりに使用してください。
man 1 kill
とman 2 kill
私のFedora 20システムでそれを持っていた。ただし、これらの両方のmanページに埋め込まれているため、特定するのは困難です。
If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid.
pubs.opengroup.org/onlinepubs/009695399/functions/kill.html
man 2 kill
は第1改正の外にあるように私は感じます:)
...この特別な信号に関するドキュメントを見つけるのは難しい場合があります。他の人が言ったことにもかかわらずman 1 kill
、Debianベースのシステムにおけるこのシグナルの唯一の言及は次のとおりです。
特に有用な信号には、HUP、INT、KILL、STOP、CONT、および0があります。
特に信号が何をするのかまだわからない場合は特に役に立ちません。また、の出力にはリストされないkill -l
ため、すでに知らない限り、そのことを知ることはできません。
DebianおよびUbuntuシステムでman 2 kill
は、一部は次のように出力されます。
sigが0の場合、シグナルは送信されませんが、エラーチェックは実行されます。これは、プロセスIDまたはプロセスグループIDの存在を確認するために使用できます。
を使用kill -0
して、プロセスが実行されているかどうかを確認できます。これらの例を検討してください。
# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid
# Check if a PID exists. When missing, this should result
# in output similar to:
# bash: kill: (6228) - No such process
# Exit status: 1
kill -0 $pid; echo "Exit status: $?"
また、を使用kill -0
して、現在のユーザーが特定のプロセスにシグナルを送る権限を持っているかどうかを確認することもできます。例えば:
# See if you have permission to signal the process. If not,
# this should result in output similar to:
# bash: kill: (15764) - Operation not permitted
# Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"
kill(2)
:ここでは、スニペットだThe kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
kill
manページ:「sigが0であれば、何の信号が送信されませんが、エラーチェックがまだ行われています。」
このコマンドは、$ pidのPIDを持つプロセスが生きているかどうかをチェックします。
$pid
が実行されている可能性があるが、シグナルを送信する権限がないため)。
kill(1)
それぞれに異なるエラーを出力します。したがって、シグナルを送信する権限があるかどうかに関係なく、pidが有効かどうかを確認できます。さらに、の一般的な使用方法はkill -0
、pidが常に正しく使用されていなくても、pidが生きているかどうかを確認することです。この答えは正しいと思います(スペルは別として)。
kill -0 $pid
どちらの場合も同じにはなりません。それは戻ります1
、あなたがのouputを解析せずに言うことはできませんので、kill
あなたがそれに信号を送信する権限を持っていない場合、プロセスが実行されているかどうかを。編集:はい私はそれがプロセスが生きているかどうかをチェックするためにほとんどの時間使用されることを知っています、しかしあなたがシグナルを送る許可を持っていることを保証できない限り(例えば:rootである)
kill
bashの組み込み(質問にはタグが付けられていますbash
)がstderrにエラーのタイプを出力するため、技術的にはそのケースもカバーすることを私は伝えています戻りコードのエラーの。つまり、出力を正しく解釈すれば、「このコマンドは、$ pidにPIDを持つプロセスが存在するかどうかを確認します」は完全に正しいです。[答えに-1を与えたと言わなかったら、私はコメントしなかったでしょう。あなたのコメントはそれ以外の場合は有効です。
Kill -0 $ pidは、pidを持つプロセスが存在するかどうかをチェックします。
'kill -0 $ pid'を使用してプロセスの存在を確認するときは注意してください。
目的のプロセスが終了すると、そのpidを他の新しく作成されたプロセスに割り当てることができます。(つまり、特定のプロセスが生きているかどうかを確認することはできません)
ゾンビプロセスの場合、子は親が待機を呼び出すのを待っています。ここでは$ pidを保持し、そのプロセスが実行されていないときに肯定的な結果を提供します。
Kill -0 $ pidは、$ pidで実行されているプロセスが生きているかどうかを確認するために使用されます。ただし、プロセスが終了して新しいプロセスが実行されると、プロセスIDを再割り当てできるため、これは注意が必要です。killall -0を使用して、特定のプロセスが実行されているかどうかを確認できます。
EXIT
シグナルの送信、または0
プロセスへの送信:stdout
成功した場合、出力は送信されません。stderr
何かが正しくない場合は、エラーメッセージを送信します。より明確には、シェルスクリプトに役立つ関数は次のようになります。
function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}
これはstdout
成功時にはテキストを返さずstderr
、失敗時にはエラーメッセージを返します(ただし、そのエラーメッセージをにリダイレクトしました/dev/null
)。
無効/ゾンビプロセスステータスが心配な場合は、を使用してps
、できれば--no-headers
スイッチを使用する必要があります。
#!/bin/ksh
function trim ()
{
echo -n "$1" | tr -d [:space:]
}
function getProcessStatus ()
{
trim $(ps -p $1 -o stat --no-headers)
}
function isZombie ()
{
typeset processStatus=$(getProcessStatus $1)
[[ "$processStatus" == "Z" ]]
return $?
}