プロセスが実行されているかどうかを確認するためによく使用されるイディオムの1つは、kill -s 0 $pid
を使用することです。
私の質問は、[[ -e /proc/$pid ]]
コンストラクトを使用することに何か利点がありますか?
私が書いているスクリプトは、Linuxとbashの両方に固有のものです。
前者は移植可能であり、POSIXで指定されているため、kill -s 0 pid
よりも/proc/pid
のテストをお勧めします。スクリプトがLinuxをターゲットにしている場合でも、何らかの理由で/proc
がアンマウントされる(ごくわずかな)リスクがあります。
私は通常、/proc
から直接コンテンツを読み取る場合にkill
などのコマンドを使用します。利点は、kill
などのツールが成功したかどうかにかかわらずステータスコード($?
を考えてください)を返すことです。 /proc
コンテンツと自分でロールすること。
さらに、専用コマンドを使用すると、さまざまなUnix間でコードの移植性が向上します。 /proc
は、SolarisやAIXなどの他のUnixでは広く使用されていません。
殺すためのテストプロセス。
$ sleep 10 &
[1] 11639
今、私たちはそれを殺します。
$ kill 11639
[1]+ Terminated sleep 10
成功しましたか?
$ echo $?
0
ゼロは、成功したことを意味します。それ以外は、さまざまな方法で処理できます。 /proc
を直接読むと、少し困惑します。
同じ状況で、存在しないプロセスを強制終了しようとしています。
$ kill 61234
bash: kill: (61234) - No such process
それについてのフィードバックを受け取ります。
$ echo $?
1
$pid
ではなく、名前でプロセスを強制終了または検索したい場合は、pkill
とpgrep
を使用して調査することもできます。しかし、それは最終的にあなたがやろうとしていることに依存します。
kill -s 0 $pid
と[ -e /proc/$pid ]
には大きな違いがあります。後者は、このPIDを持つプロセス(またはゾンビ)があるかどうかをテストします。前者は、シグナルを送信できるプロセス(またはゾンビ)にのみ一致します。つまり、プロセスの実際のUIDまたは保存されたUIDは、これを実行しているシェルのUIDと同じである必要があります(シェルがルートとして実行されている場合を除く)。その場合、違いはありません)。
どちらを使用するかは、他のユーザーのプロセスと一致させるかどうかによって異なります。
kill -s 0 $pid
は非常に移植性があります(POSIX準拠です)。 /proc/$pid
がないため、BSDユニスでは/proc
のテストは機能しません。同じ効果を達成するためのポータブルな方法はps -p $pid >/dev/null 2>/dev/null
です。