watch 명령은 스크립트만 실행할 때와 다른 ps 결과를 표시합니다.

watch 명령은 스크립트만 실행할 때와 다른 ps 결과를 표시합니다.

이것은 내 스크립트입니다.

$ 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-xwatchsh -c 'pgrep -f tomcat'watchsh

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 스크립트에서 명령을 실행할 때 "스크립트로 실행 중"임을 알고 전체 출력을 수행합니다.

pscommand 로 실행되는 스크립트에서 명령을 실행할 때 TTY 환경(예: 스크립트 내)에 있지 않다는 사실을 알지 못하므로 출력 크기를 정확히 80으로 자릅니다 watch. ps뭔가 문제가 있습니다. 수정: ps -ww(무한 너비) iff를 사용하여 시계 내에서 실행합니다. 어쩌면 다른 방법이 있을 수도 있습니다. 이상한.

set -x스크립트에 추가하는 데 유용합니다 .

관련 정보