web-dev-qa-db-ja.com

Shellスクリプトの `kill -0 $ pid`は何をしますか?

here 1から始まるSIGNAL番号が表示されるため、基本的に、「0」が表す信号は何ですか。

135
gjain

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

...この特別なシグナルに関するドキュメントを見つけるのは難しいかもしれません。他の人が言ったことにも関わらず、Debianベースのシステムのman 1 killでこのシグナルについて言及しているのは以下だけです:

特に有用な信号には、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: $?"
124
Todd A. Jacobs

このコマンドは、$ pidにPIDがあるプロセスが生きているかどうかをチェックします。

6
Fritz G. Mehner

Kill -0 $ pidは、pidを持つプロセスが存在するかどうかを確認します。

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

  1. 目的のプロセスが終了すると、そのpidを新しく作成された他のプロセスに割り当てることができます。 (だから、特定のプロセスが生きているかどうかはわからない)

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

4
Sandeep_black

http://djangstorm.com/Content/kill.html 。エラーチェック。ここでは、ユーザーがコマンドを実行するために使用できる特権を示します。

1
Rane

Kill -0 $ pidは、$ pidで実行されているプロセスが生きているかどうかを確認するために使用されます。ただし、プロセスが終了して新しいプロセスが実行されると、プロセスIDを再割り当てできるため、これは難しい場合があります。 killall -0を使用して、特定のプロセスが実行されているかどうかを確認できます。

1
user9344710