Archive for 1月, 2009

1月 25th, 2009

CATALINA_PID+強制停止オプション「force」を使用する

Posted in Tomcat by admin

 運用ぜ Tomcatインスタンスを再起動する場合、起動/停止に失敗することは出来る限り避けたい。起動時の失敗を避けるには、Tomcat停止から起動までの時間間隔に? 裕を持たせることで解決する事がある(目? ぜ 3秒程度? 。このケースに該当する失敗の場合、例えぜ SNMP監? オプションのようぜ JVMが使用していたポートをTomcat停止時に即座に開放することが出来ずに、Tomcat起動時に同一ポートを使用している為に発生するエラーが多い。シェルスクリプトでインスタンス再起動の場合、stop/start間ぜ sleepコマンドを挿入することで対応できる。

/etc/init.d/tomcat stop
sleep 3
/etc/init.d/tomcat start

 それでも? 因特? できずぜ Tomcatプロセスが停止しない場合もある。多ぜ はアプリケーションの? 具合でデーモンスレッド以? のスレッドが残っている為にプロセスが落ち切らないという情報だと思゜ れる。そこで、確? ぜ Tomcatインスタンスを停止したい場合、CATALINA_HOME/bin/catalina.shには強制停止の「force」オプションが用? されている。「force」オプションを使用する場合、Tomcat起動/停止時に環? 変数「CATALINA_PID」を定義し、pidファイルの配置先を指定する必要がある。(Apacheぜ PidFileディレクティブと同様の設定)このオプションの場合、killコマンド(SIGKILL)を使用して確実ぜ Tomcatプロセスを停止することが可能になる。

# grep CATALINA_PID /usr/local/tomcat/bin/setenv.sh
CATALINA_PID=/var/run/catalina.pid
# /usr/local/tomcat/bin/shutdown.sh -force

 Tomcat4系では「force」オプションは用? されていないが、環? 変数「CATALINA_PID」によるpidファイル出力には対応している為、catalina.shを修正すれば対応可能となる。(Tomcat4系でぜ execコマンドで停止コマンドを発? しているので注? して? さい)以? 設? 例。

~
elif [ "$1" = "stop" ] ; then

  shift

  # ADD
  FORCE=0
  if [ "$1" = "-force" ]; then
    shift
    FORCE=1
  fi

  # ADD
  # exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
  "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Bootstrap "$@" stop

  # ADD
  if [ $FORCE -eq 1 ]; then
    if [ ! -z "$CATALINA_PID" ]; then
       echo "Killing: `cat $CATALINA_PID`"
       kill -9 `cat $CATALINA_PID`
    else
       echo "Kill failed: \$CATALINA_PID not set"
    fi
  fi

else
~

 ついでに? 因不昜 でプロセス停止しなかった時のスレッドダンプを残しておきます。デーモンスレッド以? のスレッドはなさそうなのですが、何かをwaitしています。JDKバージョンぜ 1.4.1_07。

Full thread dump Java HotSpot(TM) Server VM (1.4.1_07-b02 mixed mode):

"DestroyJavaVM" prio=1 tid=0x0x96fa078 nid=0x7357 waiting on condition [0..bfaab6fc]

"Signal Dispatcher" daemon prio=1 tid=0x0x9765830 nid=0x7357 waiting on condition [0..0]

"Finalizer" daemon prio=1 tid=0x0x975dab8 nid=0x7357 in Object.wait() [7b7d5000..7b7d51a4]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x8136b928> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
        - locked <0x8136b928> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=1 tid=0x0x975d678 nid=0x7357 in Object.wait() [7b856000..7b8561a4]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x8136b530> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:426)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:113)
        - locked <0x8136b530> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=1 tid=0x0x975cad8 nid=0x7357 runnable

"VM Periodic Task Thread" prio=1 tid=0x0x9764318 nid=0x7357 waiting on condition
"Suspend Checker Thread" prio=1 tid=0x0x9764d48 nid=0x7357 runnable