스크립트 이름이 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
ps | grep | grep -v grep
또는 두 개의 프로세스가 표시 되면pgrep
두 개의 일치하는 프로세스가 실행되고 있는 것입니다.ps ...
파이프라인을 거치지 않고 파이프 라인을 실행하여 직접 확인하세요wc -l
.pgrep
그게 아니고pgrep
완전히 별개의 프로그램입니다ps
. 세부 사항을 확인man pgrep
하지만 요약하면 실행pgrep -f server.sh | wc -l
이는 , then , then
ps
으로 파이프됩니다 . 이것은 명령줄 인수인 "server.sh"를 검색하고 있기 때문에 자체 파이프 프로세스 중 하나(첫 번째 프로세스 ) 와 일치합니다 .grep
grep -v
wc -l
grep
grep
grep server.sh
이것을 피하는 일반적인 방법(이전부터 존재했던 시절부터 )은 뭔가를 하는
pgrep
것이었습니다.grep
에 익숙해grep [s]erver.sh
or 와 같은 자체 명령줄을 일치시키grep server\\.sh
거나 awk를 사용하세요.ps aux | awk '/[s]erver\.sh/ {count++}; END {print count}'
또는 개수 대신 일치하는 PID 목록을 얻으려는 경우:
ps aux | awk '/[s]erver\.sh/ {print $1}'
또한 프로세스 실행 파일 이름의 기본 이름 부분에 대해 정확한 일치를 수행하는 옵션이 오랫동안
ps
Linux 패키지procps
에서 지원되었습니다 .-C cmdlist
예를 들어, 전체 프로세스 이름이 실제로 표시
ps -C apache2
되더라도 apache2 프로세스가 나열됩니다 . 이는 정규식 일치는 아니지만 기본 이름과 정확히 일치합니다. 프로세스가 표시되지 않습니다.ps aux | grep [a]pache2
/usr/sbin/apache2
ps -C apache
apache2
에서
man ps
:
-C cmdlist
명령 이름으로 선택합니다. 그러면 실행 파일 이름이 에 지정된 프로세스가 선택됩니다
cmdlist
.참고: 명령 이름은 명령줄과 다릅니다. 이전 버전의
procps
커널에서는 이 명령 이름이 15자로 잘렸습니다. 이 제한은 두 가지 모두에 대해 더 이상 존재하지 않습니다. 15자만 일치시키는 데 의존하는 경우 더 이상 일치 항목을 얻지 못할 수 있습니다.