pgrep 프로세스 개수에 추가 개수가 표시됨

pgrep 프로세스 개수에 추가 개수가 표시됨

스크립트 이름이 server.sh입니다.

 #!/bin/bash
 
  process_count=$(ps aux | grep server.sh | grep -v grep | wc -l )
  echo "total process running:"
  echo $process_count

... other script code

스크립트를 실행하면 내가 얻는 결과는 다음과 같습니다.

./server.sh
total process running:
2

프로세스 수가 1이 아닌 2로 표시되는 이유는 무엇입니까? 하나의 스크립트만 실행했고 grep 프로세스도 제외했습니다. pgrep -f server.sh를 사용하고 pgrep을 제외해도 프로세스 수는 2가 됩니다.

답변1

  1. ps | grep | grep -v grep또는 두 개의 프로세스가 표시 되면 pgrep두 개의 일치하는 프로세스가 실행되고 있는 것입니다. ps ...파이프라인을 거치지 않고 파이프 라인을 실행하여 직접 확인하세요 wc -l.

  2. pgrep그게 아니고 pgrep완전히 별개의 프로그램입니다 ps. 세부 사항을 확인 man pgrep하지만 요약하면 실행pgrep -f server.sh | wc -l

  3. 이는 , then , then ps으로 파이프됩니다 . 이것은 명령줄 인수인 "server.sh"를 검색하고 있기 때문에 자체 파이프 프로세스 중 하나(첫 번째 프로세스 ) 와 일치합니다 .grepgrep -vwc -lgrepgrepgrep server.sh

  4. 이것을 피하는 일반적인 방법(이전부터 존재했던 시절부터 )은 뭔가를 하는 pgrep것이었습니다.grep에 익숙해grep [s]erver.shor 와 같은 자체 명령줄을 일치시키 grep server\\.sh거나 awk를 사용하세요.

    ps aux | awk '/[s]erver\.sh/ {count++}; END {print count}'
    

    또는 개수 대신 일치하는 PID 목록을 얻으려는 경우:

    ps aux | awk '/[s]erver\.sh/ {print $1}'
    
  5. 또한 프로세스 실행 파일 이름의 기본 이름 부분에 대해 정확한 일치를 수행하는 옵션이 오랫동안 psLinux 패키지 procps에서 지원되었습니다 .-C cmdlist

    예를 들어, 전체 프로세스 이름이 실제로 표시 ps -C apache2되더라도 apache2 프로세스가 나열됩니다 . 이는 정규식 일치는 아니지만 기본 이름과 정확히 일치합니다. 프로세스가 표시되지 않습니다.ps aux | grep [a]pache2/usr/sbin/apache2ps -C apacheapache2

    에서 man ps:

   -C cmdlist

명령 이름으로 선택합니다. 그러면 실행 파일 이름이 에 지정된 프로세스가 선택됩니다 cmdlist.

참고: 명령 이름은 명령줄과 다릅니다. 이전 버전의 procps커널에서는 이 명령 이름이 15자로 잘렸습니다. 이 제한은 두 가지 모두에 대해 더 이상 존재하지 않습니다. 15자만 일치시키는 데 의존하는 경우 더 이상 일치 항목을 얻지 못할 수 있습니다.

관련 정보