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
...

パイプを使用すると、状況が奇妙に見え始めます。

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

答え1

まず、コメントを送ってくれた@Zeitounatorと@ABに感謝します!

さまざまなtomcatバージョンでテストしてもう少し詳しく調べたところ、実際にhave_tty設定がゼロであることに問題があることがわかりました。パイプラインでCatalinaスクリプトを使用すると、if [ -t 1 ];テストは失敗します。

catalina通常セットの正しい使用がhave_tty1かどうか混乱しています。もう1つの奇妙なことは、以前のバージョンの小さな浮気でも動作していたことです。実際にこのコミットで紹介されました。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プロセスなど)を介さずにコマンドラインで実行されていることを確認してください。

関連情報