정규식을 사용하여 UNIX 프로세스가 시작되었는지 확인

정규식을 사용하여 UNIX 프로세스가 시작되었는지 확인

UNIX에서는 다음 명령을 실행하여 프로세스가 시작되었는지 확인합니다.

예를 들어

psg dtllst pe99

프로세스가 실행 중이면 다음 출력이 반환됩니다.

UID    PID    PPID    C    STIME    TTY    TIME CMD
pe99   1234   1       0 03:29:44    pts/8  0:01 dtllst pe99

이제 Perl에서 이 프로세스가 시작되었는지 확인할 수 있기를 원합니다. 지금까지 나는 다음을 수행하고 있습니다

`my $checkProc = `psg dttlst | grep $myNode 2>&1`;`    #where $myNode is something like pe01 or pe02 or pe65 or pe99 etc...

이제 그 후에 위의 Perl 명령이 내가 찾고 있는 것을 반환했는지 확인하고 프로세스가 시작되었는지 확인하기 위해 다음을 수행합니다.

if ($checkProc =~ m/dtllst $myNode | $myNode/) {
    #yes, process is up
} else {
    #no, process is down
}

그러나 이것은 작동하지 않습니다. 특히 내 코드는 UNIX 프로세스가 활성화되어 있는지 여부에 관계없이 항상 if 문을 true로 평가합니다. 나는 이것이 틀렸다는 것을 안다. 그것이 문제인지 확인하기 위해 정규식에서 "$" 문자를 이스케이프 처리해 보았고 정규식에서 Perl 변수를 완전히 제거해 보았습니다.

내가 여기서 무엇을 놓치고 있는 걸까요? 내 정규식이 어딘가에 잘못되었다는 것을 알고 있습니다 :(

감사해요

답변1

이 명령은 pgrep호환되는 정규식과 일치하는 모든 프로세스(자체 제외)의 PID 목록을 인쇄합니다 grep.

일치하는 항목이 없으면 아무것도 인쇄되지 않습니다.

이는 충분한 테스트여야 합니다. [ $(pgrep process | wc) -gt 0 ]프로세스가 실행 중이면 true입니다. 없으면 거짓입니다.

답변2

나는 그것에 익숙하지 않지만 프로세스가 실행 중인지 확인하기 위해 실행하면 include 자체가 포함된 "progname" Order이기 때문에 항상 긍정적인 대답을 얻게 된다는 psg것을 (말하자면 어려운 방법으로) 알고 있습니다 .ps ax | grep prognameprognamegrep progname

나는 Perl을 모르지만 bash에서는 이 문제를 다음과 같이 해결할 수 있습니다. 예를 들어 progname 인스턴스가 실행 중인지 확인하려는 경우 실행하면 ps ax | grep -c "[p]rogname"항상 "yes"가 나오는 문제가 해결됩니다.

답변3

귀하의 정규식은 m/dtllst $myNode | $myNode/(구체적으로) 모든 항목과 일치합니다 $myNode. 구성에 따라 psg dtllst | grep $myNode일치하는 항목이 반환되므로 $myNode정규식은 항상 일치합니다.

pgrep다른 사람의 제안, 사용 또는 ps ... | grep변형을 따를 수 없는 경우 다음을 수행할 수 있습니다.

  1. "$checkProc = psg dtllst | grep 'dtllst $myNode';"을 설정한 다음 $checkProc비어 있지 않은지 테스트합니다.

  2. "$checkProc = psg dtllst;"을 설정한 다음 다음과 결합합니다.m/dtllst $myNode/

  3. 사용프로세스::프로세스테이블$pCPAN 모듈, 항목 을 검색하면 됩니다.$p->cmdline =~ m/dtllst $myNode/

답변4

이것이 당신이 원하는 것인지는 모르겠지만 프로그램의 PID를 얻는 방법은 다음과 같습니다.

ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1

그러면 인수(있는 경우)와 함께 주어진 명령에 대한 모든 PID가 출력됩니다.

원하는 경우 이를 사용하여 다른 프로그램으로 파이프할 수 있으며, 모든 PID가 한 번에 필요한 경우 전체 내용을 다음으로 래핑할 수 있습니다 $().

MyPIDs=$(ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1)
echo $MyPIDs

관련 정보