쉘 스크립트는 Tomcat 애플리케이션 종료를 도울 수 없습니다.

쉘 스크립트는 Tomcat 애플리케이션 종료를 도울 수 없습니다.

CTRL+C쉘 스크립트를 사용하여 Tomcat 애플리케이션 서버를 종료하는 동작을 복제해야 합니다 . 따라서 다음 코드는 Jenkins 파이프라인 스크립트로 작성되었습니다.

sh '''pgrep -fl catalina | awk '{print $1}' | xargs kill -SIGINT'''

하지만 신청을 거부하지는 않습니다. 그러나 터미널에서 동일한 명령을 실행하면 응용 프로그램이 닫힙니다.

pgrep -fl catalina | awk '{print $1}' | xargs kill -SIGINT

쉘 스크립트 코드의 문제점을 이해하는 데 도움을 줄 수 있습니까?

답변1

이 두 명령은 동일하지 않습니다. 첫 번째 명령은 인수를 사용하여 스크립트를 실행하려고 시도합니다 pgrep -fl catalina | awk {print( 호출 셸이 비어 있다고 } | xargs kill -SIGINT가정 ). $1"해당 파일이나 디렉터리가 없습니다" 오류가 발생합니다. 이는 참조 때문에 발생합니다.

셸에서 삼중 작은따옴표는 일반 작은따옴표를 시작하는 불편한 방법일 뿐입니다(처음 두 개의 작은따옴표는 빈 문자열이 됩니다). 그리고 작은따옴표 문자열할 수 없다작은따옴표가 포함되어 있습니다. 이는 {print $1}명령에 따옴표가 없음을 의미하므로 쉘이 확장된 다음 $1(아무것도 없을 수도 있음) 후행 공백에서 명령을 분할합니다 print.

실행 중인 파이프라인을 사용하려면 다음을 sh사용하세요 sh -c.

sh -c 'sh pgrep -fl catalina | awk "{ print \$1 }" | xargs kill -SIGINT'

또는 다음을 사용하십시오 pkill.

pkill -f -SIGINT catalina

또는,당신은 그것을 사용할 수 있습니다Tomcat 스크립트 shutdown.sh, 또는 catalina.sh stop, 또는 service tomcat stop.

답변2

글쎄, 우선, 당신은 일을 불필요하게 복잡하게 만들고 있습니다.

전체 명령 이름 "catalina"와 일치시키려는 것 같습니다. 그렇다면 "-x" 매개변수를 사용하고 싶을 것 같습니다. 그리고 "-l"을 사용하지 않으면 "awk"로 제거해야 하는 명령 이름을 얻을 수 없습니다.

pgrep -x catalina 

그런 다음 "kill" 명령줄에 "pgrep" 명령을 삽입할 수 있습니다.

sh 'kill -SIGINT `pgrep -x catalina` '

더 좋은 점은 다음과 같습니다.

killall  -SIGINT --exact catalina                                  

이것이 어떤 경우에는 작동하지만 다른 경우에는 작동하지 않는 이유는 명확하지 않습니다. Jenkins 파이프라인 컨텍스트에서는 다른(루트가 아닌) 사용자로 실행하고 터미널에서는 올바른(또는 루트) 사용자로 실행하고 있습니까?

관련 정보