Tomcat 시작 스크립트 출력이 파이프(grep)에서 작동하지 않습니다.

Tomcat 시작 스크립트 출력이 파이프(grep)에서 작동하지 않습니다.

저는 Tomcat 9.0.21 시작 스크립트 catalina.sh의 다음 동작 때문에 완전히 혼란스러워졌습니다.

# following line added by me
echo "CATALINA_HOME"
# following line added by me
echo $have_tty

if [ $have_tty -eq 1 ]; then
  # following line added by me
  echo "CATALINA_HOME"

  echo "Using CATALINA_BASE:   $CATALINA_BASE"
  echo "Using CATALINA_HOME:   $CATALINA_HOME"
  echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
  if [ "$1" = "debug" ] ; then
    echo "Using JAVA_HOME:       $JAVA_HOME"
  else
    echo "Using JRE_HOME:        $JRE_HOME"
  fi
  echo "Using CLASSPATH:       $CLASSPATH"
  if [ ! -z "$CATALINA_PID" ]; then
    echo "Using CATALINA_PID:    $CATALINA_PID"
  fi
fi

이제 실행하면 catalina version | grep CATALINA_HOME원본 스크립트 버전의 결과가 표시되지 않습니다. 내 수정된 버전의 스크립트에서"if have_tty" 부분 이전에 에코된 내용만 볼 수 있습니다!

catalina | grep CATALINA
CATALINA_HOME

또한 if 블록과 "CATALINA_HOME ... 사용" 줄 내부에서 다음 CATALINA_HOME 에코를 보고 싶습니다.

거기서 무슨 일이 일어 났어?

(중요하다면 Mac OS X 10.14.5를 실행하고 iTerm과 zsh를 셸로 사용하고 있습니다)

고쳐 쓰다

have_tty사람들은 이것이 변수가 설정되지 않았기 때문이라고 말했지만 그것은 나에게 문제가 되지 않습니다. 이것을 실행하면 catalina version전체 출력이 표시됩니다.

CATALINA_HOME
1
CATALINA_HOME
Using CATALINA_BASE:   /usr/local/Cellar/tomcat/9.0.21/libexec
Using CATALINA_HOME:   /usr/local/Cellar/tomcat/9.0.21/libexec
Using CATALINA_TMPDIR: /usr/local/Cellar/tomcat/9.0.21/libexec/temp
Using JRE_HOME:        /Users/jumar/.jenv/versions/1.8.0.171
Using CLASSPATH:       /usr/local/Cellar/tomcat/9.0.21/libexec/bin/bootstrap.jar:/usr/local/Cellar/tomcat/9.0.21/libexec/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.21
...

파이프(grep)를 사용하면 상황이 이상해 보이기 시작합니다.

catalina version | grep CATALINA_HOME
CATALINA_HOME
# here should be the missing "Using CATALINA_HOME..."

답변1

먼저 의견을 보내주신 @Zeitounator와 @AB에게 감사드립니다!

다양한 tomcat 버전으로 테스트하고 조금 더 자세히 조사한 결과 실제로 have_tty설정이 0인 데 문제가 있다는 것을 발견했습니다. 파이프라인에서 Catalina 스크립트를 사용하면 if [ -t 1 ];테스트가 실패합니다.

catalina일반 세트 의 올바른 사용이 have_tty1인지 혼란 스럽습니다. 더 이상한 점은 이전 버전의 작은 바람둥이와도 작동했다는 것입니다. 실제로 이 커밋에서 소개되었습니다.https://github.com/apache/tomcat/commit/bf894a0e6b5c8f92b122452645e93d63277ad3ab

-t 1이 테스트는 파이프라인에서 사용하기엔 부적합한 것 같습니다 . 대신에 그렇게 해야 합니다 -t 0(이는 "보통 테스트는 표준 입력에서 수행됩니다"라는 AB의 설명을 기반으로 합니다).

답변2

| grep CATALINA다음 줄에서 출력이 나오지 않으면 테스트 명령에서 제거하세요 .

echo $have_tty

그러면 $have_tty가 설정되지 않아 실행이 if 블록에 들어가지 않게 됩니다. $have_tty가 원래 설정된 위치를 추적해야 합니다.

Catalina가 사용하는 것 같습니다.이 명령tty가 있는지 확인합니다.

$ tty
/dev/ttys011

tty를 얻으려면 스크립트가 tty가 아닌 프로세스(예: init 프로세스)를 통하지 않고 명령줄에서 실행되는지 확인하세요.

관련 정보