私はログファイルを解析して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が実行されないと常に想定できますか? AFAIKps
自体がとにかく情報を取得できるので、そうしたいと思います/proc
。しかし、これは本番コード用なので、確認したいと思います。
/proc/PID
もしそうなら、実行中のプロセスにディレクトリがないか、/proc/PID
ディレクトリがありますが、プロセスが実行されていない状況がありますか?ps
ディレクトリが存在することを確認するのではなく、解析を好む理由はありますか?
ベストアンサー1
kill(0,$pid)
Perl関数を使用できます。
戻りコードが1の場合、PIDが存在し、ここに信号を送信できます。
戻りコードが0の場合は$!を確認する必要があります。プロセスが存在することを意味するPermission Denied(EPERM)、またはプロセスが存在しない場合はESRCHです。
チェックコードが実行されている場合は、root
kill 0 =>エラー、1 =>正常な戻りコードのみを確認するように単純化できます。
たとえば、
% perl -d -e 0
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(-e:1): 0
DB<1> print kill(0,500)
0
DB<2> print $!
No such process
DB<3> print kill(0,1)
0
DB<4> print $!
Operation not permitted
DB<5> print kill(0,$$)
1
これは単純な関数にすることができます
use Errno;
sub test_pid($)
{
my ($pid)=@_;
my $not_present=(!kill(0,$pid) && $! == Errno::ESRCH);
return($not_present);
}
print "PID 500 not present\n" if test_pid(500);
print "PID 1 not present\n" if test_pid(1);
print "PID $$ not present\n" if test_pid($$);