基本的に、「0」はどの信号を表しますか。これは、ここでは1から始まるSIGNAL番号が表示されているためです。
6 に答える
シグナル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 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 -0 $pid
プロセスID(pid)のプロセスが存在するかどうかを確認することです。
kill -0 $pid
プロセスの存在を確認するために使用するときは注意してください。
目的のプロセスが終了すると、そのpidを他の新しく作成されたプロセスに割り当てることができます。(したがって、特定のプロセスが有効であるかどうかを確認することはできません)
親がwaitを呼び出すのを子が待機しているゾンビプロセスの場合。ここでは、$ pidを保持し、そのプロセスが実行されていないときに肯定的な結果を出します。
このコマンドは、$pidにPIDが含まれるプロセスが有効かどうかを確認します。
kill -0 $pid
で実行されているプロセスが稼働して$pid
いるかどうかを確認するために使用されます。ただし、プロセスが終了して新しいプロセスが実行されると、プロセスIDを再割り当てできるため、これには注意が必要です。
killall -0 <process name>
特定のプロセスが実行されているかどうかを確認するために使用できます。
EXIT
シグナルを送信するか0
、プロセスに送信すると、次のようになります。
- プロセスの存在を確認します。
- プロセスでさまざまなエラーチェックを実行します(PID、PGIDなど...)。
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 $?
}