grep -v가 쉘 스크립트에서 작동하지 않습니다

grep -v가 쉘 스크립트에서 작동하지 않습니다

내 쉘 스크립트에는 다음 줄이 있습니다.

tomcatPID=$(ps -ef | grep tomcat | grep $TOMCAT_ACCOUNT | grep -v grep | grep -v restart | awk '{print $2}')

$TOMCAT_ACCOUNT해당 부분에는 문제가 없는 것으로 확인되었습니다 . 내가 겪고 있는 문제는 grep -v. 이것은 터미널에서 작동하지만 쉘 스크립트에 넣으면 이를 무시하고 grep이를 포함하는 결과를 제공합니다.

문제는 grep -v쉘 스크립트에서는 무시되지만 터미널에서는 잘 작동하는 이유는 무엇입니까?

예를 들어:

내가 아래에서 작업하고 있다고 가정 become application하고 application@servername터미널에서 다음을 실행합니다.

tomcatPID=$(ps -ef | grep tomcat | grep application | grep -v grep | grep -v restart | awk '{print $2}')

출력: 42345내 애플리케이션을 실행하는 Tomcat의 processID입니다.

내가 만들고 file.sh내부에 생성하면 정확히 동일합니다.

tomcatPID=$(ps -ef | grep tomcat | grep $TOMCAT_ACCOUNT | grep -v grep | grep -v restart | awk '{print $2}')

그런 다음 다음 명령을 사용하여 실행합니다. ./file.sh 출력: 42345 6534이것은 내 프로세스 ID tomcat와 내가 실행 중인 프로세스 ID 입니다 processID. grep따라서 grep -v grep두 번째 processID를 가져오는 것은 방지되지만 .sh파일 내에서는 무시됩니다.

답변1

필요한 PID를 얻는 더 나은 방법을 제안하십시오 pgrep. 이 예에서는 내 Java Tomcat 프로세스를 찾습니다.

TOMCAT_ACCOUNT=tomcat
ps -fu "$TOMCAT_ACCOUNT"
UID        PID  PPID  C STIME TTY          TIME CMD
tomcat     678     1  0 Jun04 ?        00:47:49 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -Dja
tomcat    1900   678  0 Jun04 ?        00:00:02 /usr/lib/libreoffice/program/soffice.bin --accep

pgrep -u "$TOMCAT_ACCOUNT" java
678

매우 구체적인 요구 사항이 있는 경우( tomcat사용자가 실행하는 프로세스 명령 내에 있어야 하며 줄의 어디에도 $_TOMCAT_ACCOUNT포함되어서는 안 됨 ) 다음을 사용할 수 있습니다.restart

TOMCAT_ACCOUNT=tomcat
ps -fu "$TOMCAT_ACCOUNT" | awk '/.[t]omcat/ && !/[r]estart/ {print $2}'
678

관련 정보