>

로그 파일을 구문 분석하여 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 파싱을 선호하는 이유가 있습니까?  디렉토리가 있는지 점검하는 중입니까?


  • 답변 # 1

    펄 함수 kill(0,$pid)  사용할 수 있습니다.

    반환 코드가 1이면 PID가 존재하며 신호를 보낼 수 있습니다.

    반환 코드가 0이면 $!를 확인해야합니다. 프로세스가 존재 함을 의미하는 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($$);
    
    
    /proc/PID

관련 자료

  • 이전 text processing - 쉘 스크립트에서 XML 파일을 구문 분석하는 방법
  • 다음 로그에서 텍스트를 grep/awk/sed하고 텍스트가있는 청크를 표시하는 방법은 무엇입니까?