147

基本的に、「0」はどの信号を表しますか。これは、ここでは1から始まるSIGNAL番号が表示されているためです。

4

6 に答える 6

144

シグナル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.
...
于 2012-06-13T10:16:04.647 に答える
132

これは良い質問です...

...この特別な信号に関するドキュメントを見つけるのは難しい場合があります。他の人が言ったことにもかかわらず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: $?"
于 2013-01-12T18:08:44.293 に答える
10

kill -0 $pidプロセスID(pid)のプロセスが存在するかどうかを確認することです。

kill -0 $pidプロセスの存在を確認するために使用するときは注意してください。

  1. 目的のプロセスが終了すると、そのpidを他の新しく作成されたプロセスに割り当てることができます。(したがって、特定のプロセスが有効であるかどうかを確認することはできません)

  2. 親がwaitを呼び出すのを子が待機しているゾンビプロセスの場合。ここでは、$ pidを保持し、そのプロセスが実行されていないときに肯定的な結果を出します。

于 2017-03-26T11:12:11.597 に答える
6

このコマンドは、$pidにPIDが含まれるプロセスが有効かどうかを確認します。

于 2012-06-13T10:11:55.997 に答える
1

kill -0 $pidで実行されているプロセスが稼働して$pidいるかどうかを確認するために使用されます。ただし、プロセスが終了して新しいプロセスが実行されると、プロセスIDを再割り当てできるため、これには注意が必要です。

killall -0 <process name>特定のプロセスが実行されているかどうかを確認するために使用できます。

于 2018-02-11T05:20:08.660 に答える
1

EXITシグナルを送信するか0、プロセスに送信すると、次のようになります。

  1. プロセスの存在を確認します。
  2. プロセスでさまざまなエラーチェックを実行します(PID、PGIDなど...)。
  3. stdout成功した場合、出力は送信されません。
  4. stderr何かが正しくない場合は、にエラーメッセージを送信します。
  5. プロセスが機能していない場合(つまり、ゾンビ)、誤検知を発生させます。

より明確に言えば、シェルスクリプトに役立つ関数は次のとおりです。

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 $?
}
于 2020-03-10T12:50:50.670 に答える