うまいぼうぶろぐ

linuxとhttpdとperlのメモ

tomcatが素直に停止できない、、原因がわかった

現在確認中なので、真偽のほどは少し怪しいですが。

tomcatのversionは5.5.28。起動自体は問題ないけど、停止の処理がおかしい。停止のコマンド打っても、3分ほどプロセスが残ったままだ。8080ポートはlistenしてるけど、アクセスしても応答は返ってこない状態

jsvcを使う方法と、catalina.shを叩く2通りの方法で試したが、両方ともダメだった。

jsvc

jsvcで起動後、停止させてみた(確認のためdebugオプションをつけて)。jsvc stopの処理の部分は具体的にはこんな感じで(jsvc-src/native/tomcat5.shのsampleと同じ)

jsvc \
  -debug \
  -stop \
  -pidfile=/var/run/tomcat.pid \
  org.apache.catalina.startup.Bootstrap

すると、pidが表示されてそのうち失敗する。

17/10/2009 15:49:31 20481 jsvc debug: get_pidf: 3 in /var/run/tomcat5.pid
17/10/2009 15:49:31 20481 jsvc debug: get_pidf: pid 20425
17/10/2009 15:49:37 20481 jsvc debug: get_pidf: 3 in /var/run/tomcat5.pid
17/10/2009 15:49:37 20481 jsvc debug: get_pidf: pid 20425
(中略)

この後、3分ほど経過するとプロセスは落ちる。そのときにcatalina.outに致命的なエラーが出てたけど、なんだったか忘れた。

CATALINA_HOME/bin/shutdonw.shを実行

startup.sh(catalina.sh start)で起動。その後、shutdown.sh(catalina.sh stop)叩く。

# /usr/local/tomcat/bin/shutdown.sh
Stopping the tomcat service.
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/default
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar

と、いつものように環境変数だけ出して処理はバックグラウンドへ。この後、psで見ててもtomcatのプロセスは残ったまま。port 8080はlistenしているけど応答は返ってこない。で、jsvcと同様に3分ほど経過するとプロセスは落ちる。んー気になるー。

追記

試行錯誤してたら原因がわかった。どうもstopする際には、`hostname`のAJP port(defaultで8009) に何かしらの通信(SHUTDOWNって文字列を送ってるんだったかな)を行ってからshutdownする様子。なので

  1. /etc/hosts が開発用の設定などで、`hostname` のIPのアドレスに通信できない
  2. selinux, iptables 等でportを塞いでいる

場合にスムーズにshutdownできなくなる。