ログファイルを解析してPIDを収集し、そのPIDが実行されているかどうかを確認するPerlスクリプトを作成しています。私はそのチェックを行うための最良の方法を考えようとしています。明らかに、私は次のようなことができます:
system("ps $pid > /dev/null") && print "Not running\n";
ただし、可能な場合はシステムコールを避けたいと思います。そのため、/proc
ファイルシステムを使用できると考えました(移植性は問題ではありません。これは常にLinuxシステムで実行されます)。例えば:
if(! -d "/proc/$pid"){
print "Not running\n";
}
それは安全ですか?/proc/$pid/
ディレクトリがない場合、関連するPIDが実行されていないと常に想定できますか?AFAIK ps
自体は/proc
とにかくその情報を取得するので、私はそう期待していますが、これは本番コード用であるため、確実にしたいです。
それで、実行中のプロセスに/proc/PID
ディレクトリがない場合や、/proc/PID
ディレクトリが存在し、プロセスが実行されていない場合がありますか?ps
ディレクトリの存在を確認するよりも解析を好む理由はありますか?
kill -0
最高のメソッド)、これは指定されたPIDで実行中のプロセスがあるかどうかだけを通知することに注意してください。プロセスがまだ1ミリ秒後に実行されるかどうかはわかりません。また、興味のあるプロセスか、興味深いプロセスが終了した後に同じPIDが割り当てられた無関係のプロセスかどうかはわかりません。ほとんどの場合、特定のPIDが実行されているかどうかをテストするのは間違いです。競合状態になりにくい状況はほとんどありません。
kill
シグナル0を使用するperl 関数もあります。この関数は、強制終了はしませんが、強制終了できるかどうかを示します(つまり、そのプロセスにシグナルを送信する許可が必要です)。