特定のPIDが実行されていることを確認するにはどうすればよいですか?

特定のPIDが実行されていることを確認するにはどうすればよいですか?

私はログファイルを解析して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です。

チェックコードが実行されている場合は、rootkill 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($$);

おすすめ記事