555 のような PID があるとします。その pid が実行中か完了したかを確認したいと思います。/proc/ を確認できますが、本番環境ではアクセスできません。「ps」へのパイプを開くようなハックなものを除いて、これを行う最良の方法は何ですか?
2 に答える
os.kill()
シグナル番号 0 で関数を使用します。プロセスpidが存在する場合、呼び出しは成功します。そうでない場合、OSError
例外が発生します。
try:
os.kill(pid, 0)
print("process exists")
except OSError:
print("process does not exist")
kill(2)
私のシステムのドキュメントには次のように書かれています:
kill () 関数は、 sig によって与えられたシグナルをpid、プロセスまたはプロセスのグループに送信します。 Sigは、sigaction(2) で指定されたシグナルの 1 つ、または 0 の場合があります。この場合、エラー チェックは実行されますが、実際にはシグナルは送信されません。これは、 pidの有効性をチェックするために使用できます。
グレッグが述べたように使用os.kill()
しますが、 kill システムコールはプロセスが存在するかどうかではなく、プロセスに kill を送信できるかどうかをテストすることに注意してください。失敗モードの 1 つはプロセスが存在しない場合ですが、もう 1 つはプロセスを強制終了する権限がない場合です。区別するには、例外を確認する必要があります。
try:
os.kill(pid, 0)
print 'Process exists and we can kill it'
except OSError, e:
if e.errno == 1:
print 'Process exists, but we cannot kill it'
else:
raise
これは、チェックしているプロセスを強制終了する権限が常にあることがわかっている場合は必要ありません。たとえば、ルートとして実行している場合や、プロセスをチェックしているプロセスと同じ UID でプロセスが実行されていることがわかっている場合などです。