이것은 내 스크립트입니다.
$ cat count_tomcat.sh
ps -ef | grep tomcat| wc -l
$ ./count_tomcat.sh
2
이제 watch
명령을 사용하면 다른 결과가 나타납니다.
$ watch ./count_tomcat.sh
Every 2.0s: ./count_tomcat.sh Fri Oct 15 16:50:43 2021
5
답변1
빨리 달려:
watch -x pgrep -c -f tomcat
주기적으로 명령줄에 포함을 가져옵니다 tomcat
.
또는
watch -x pgrep -c -x tomcat
ps -e
이름으로 프로세스에 대한 정보(명령줄이 아님, wrt 출력에서와 같이 ps -ef
)예수코양이.
또는:
watch -x pgrep -c -u tomcat
사용자로 실행되는 프로세스 수 ( 일치하려는 출력 열이 tomcat
확실하지 않기 때문에 ).ps -ef
의 경우 -x
적어도 procps-ng
구현을 위해 watch
셸 실행을 건너뛰고 대신 명령을 직접 실행합니다.
pgrep -f tomcat
(명령줄에 포함된 경우에도) 자체적으로 보고하지는 않지만 명령 을 tomcat
계산 하고 명령에 추가 하지 않습니다. 이는 구현이 마지막 명령의 분기를 최적화하지 않는 경우 명령줄을 구문 분석하기 위해 호출 될 수 있습니다. .watch
-x
watch
sh -c 'pgrep -f tomcat'
watch
sh
watch -x pgrep -cf '[t]omcat'
[t]omcat
패턴 자체가 일치하지 않기 때문에 이러한 상황을 피할 수 있습니다 .
(그렇지 않은 경우 -x
다음과 같아야 합니다.
watch 'pgrep -cf "[t]omcat"'
마찬가지로 쉘 와일드카드 이므로 [x]
쉘과 실행 중인 쉘 모두에서 watch
이스케이프 해야 합니다.)
vi tomcat.conf
물론, 실행 중인 프로세스나 atomcatalog
. 명령줄 기반 일치 프로세스는 매우 취약합니다. pgrep
더 많은 옵션을 추가하여 필터를 구체화하고 잘못된 프로세스를 식별할 위험을 제한할 수 있습니다 .
최신 Linux 시스템에서는 제어 그룹에 의존하거나 해당 정보를 쿼리할 수 있어야 합니다 systemd
( tomcat
서비스로 올바르게 설정된 경우).
답변2
./count_tomcat.sh
스크립트를 "일반적으로" 실행하면 새로운 bash 프로세스가 생성되지 않고 현재 bash 프로세스에서 실행되는 것으로 나타났습니다 . 따라서 출력에는 이 스크립트에 대한 새 항목이 없습니다 ps
.
watch를 통해 실행하면 스크립트를 인수로 사용하여 새로운 bash 프로세스가 생성됩니다. 이제 스크립트 자체가 ps
출력에 나타납니다. 그러니 ps
및 에 주의하세요 watch
.
두 번째 문제: ps
"일반" bash 스크립트에서 명령을 실행할 때 "스크립트로 실행 중"임을 알고 전체 출력을 수행합니다.
ps
command 로 실행되는 스크립트에서 명령을 실행할 때 TTY 환경(예: 스크립트 내)에 있지 않다는 사실을 알지 못하므로 출력 크기를 정확히 80으로 자릅니다 watch
. ps
뭔가 문제가 있습니다. 수정: ps -ww
(무한 너비) iff를 사용하여 시계 내에서 실행합니다. 어쩌면 다른 방법이 있을 수도 있습니다. 이상한.
set -x
스크립트에 추가하는 데 유용합니다 .