web-dev-qa-db-ja.com

`kill -s 0 $ pid`と` [[-e / proc / $ pid]] `を使用してPIDが実行されているかどうかを検出します

プロセスが実行されているかどうかを確認するためによく使用されるイディオムの1つは、kill -s 0 $pidを使用することです。

私の質問は、[[ -e /proc/$pid ]]コンストラクトを使用することに何か利点がありますか?

私が書いているスクリプトは、Linuxとbashの両方に固有のものです。

6
Hubert Kario

前者は移植可能であり、POSIXで指定されているため、kill -s 0 pidよりも/proc/pidのテストをお勧めします。スクリプトがLinuxをターゲットにしている場合でも、何らかの理由で/procがアンマウントされる(ごくわずかな)リスクがあります。

6
jlliagre

私は通常、/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ではなく、名前でプロセスを強制終了または検索したい場合は、pkillpgrepを使用して調査することもできます。しかし、それは最終的にあなたがやろうとしていることに依存します。

2
slm

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です。