내 쉘 스크립트에는 다음 줄이 있습니다.
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