最近、シェルスクリプトでこの問題が発生しました。
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
kill -0 ...
効果は何ですか?
ベストアンサー1
これは収集するのが少し難しいですが、次の2つのマニュアルページを見ると、次の説明が表示されます。
殺す(1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
殺す(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.
...
したがって、シグナル0は実際にはプロセスのPIDに何も送信しませんが、それを行う権限があることを確認します。
これはどこで役に立ちますか?
これを確認するための1つの明確な場所は、実行中のプロセスにシグナルを送信して権限があることを確認したい場合ですkill
。kill
希望の実際の信号を送信する前に、まずチェックできるようにkill -0 <PID>
チェックをラップして確認できます。
はい
次のように、プロセスがルートによって実行されているとします。
$ sudo sleep 2500 &
[1] 15693
別のウィンドウでこのコマンドを実行すると、PIDが実行されていることを確認できます。
$ pgrep sleep
15693
次に、このコマンドを試してPID信号を送信する権限があることを確認しますkill
。
$ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi
bash: kill: (15693) - Operation not permitted
You're weak!
したがって、動作するが出力にkill
権限がないというコマンドからのメッセージが漏れます。あまりありません。 STDERRをキャプチャして/dev/null
。
$ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi
You're weak!
完全な例
それから私達は次のようにすることができますkiller.bash
:
#!/bin/bash
PID=$(pgrep sleep)
if ! kill -0 $PID 2>/dev/null; then
echo "you don't have permissions to kill PID:$PID"
exit 1
fi
kill -9 $PID
これで、root以外のユーザーとして上記のコマンドを実行すると、次のようになります。
$ ~/killer.bash
you don't have permissions to kill PID:15693
$ echo $?
1
ただし、rootとして実行する場合:
$ sudo ~/killer.bash
$ echo $?
0
$ pgrep sleep
$