Tomcatの自動起動スクリプトではまる

Pexels photo 247791

Tomcatの自動起動スクリプトの設定ではまる。起動は普通にできるのだが終了がうまくできない。しかも毎回失敗するわけではなく、タイミングによってはうまくいく。

よくよく調べてみると、Tomcatのシャットダウンに使用するServer Port(デフォルト8005)が起動しきっていない状態でシャットダウンしているのが原因だった。環境によっては起動しきるのが遅く、完全に起動しきらない状態でシャットダウンしようとするとエラーになるのだ。

シャットダウン時に終了しきるまでビジーウェイトする方法もあるようだが、今回はCATALINA_PIDを指定し、かつshutdownのオプションに”-force”を指定することにした。CATALINA_PIDを指定して「catalina.sh start」した後、「catalina.sh stop -force」で止めると、通常の方法でシャットダウンできない場合に、CATALINA_PIDで指定したpidファイルからプロセスIDを読み込み、tomcatのプロセスをKILLしてくれる。

結局/etc/init.d/tomcat8は以下のようになる。

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

###### added here #####
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
export TOMCAT_HOME=/usr/local/tomcat8
export CATALINA_HOME=/usr/local/tomcat8
#export CATALINA_PID=/var/run/tomcat8.pid
###### added here #####

TOMCAT_SCRIPT=$CATALINA_HOME/bin/catalina.sh
TOMCAT_USER=tomcat

[ -f $TOMCAT_SCRIPT ] || exit 0

# See how we were called.
case "$1" in
    start)
        # Start daemons.
        if [ -f /var/lock/subsys/tomcat8 ] ; then
            echo "Tomcat already started!"
            exit 1
        fi
        echo -n "Starting Tomcat: "
        #/bin/su -s /bin/bash - $TOMCAT_USER -c "$TOMCAT_SCRIPT start" >/tmp/tomcat.log 2>&1
        ###### su->runuser by src #####
        /sbin/runuser -p -s /bin/bash - $TOMCAT_USER -c "$TOMCAT_SCRIPT start"
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat8
        ;;
    stop)
        # Stop daemons.
        if [ ! -f /var/lock/subsys/tomcat8 ] ; then
            echo "Tomcat already stopped!"
            exit 1
        fi
        echo -n "Shutting down Tomcat: "
        $TOMCAT_SCRIPT stop -force
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat8
        ;;
    status)
        status tomcat
        exit $?
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $TOMCAT_PROG {start|stop|status|restart}"
        exit 1
esac

exit 0

なおCATALINA_PIDは$CATALINA_HOME/bin/setenv.shで設定する。

CATALINA_PID=$CATALINA_HOME/catalina.pid

runuserのせいか環境変数の引き継ぎが行われないため、他で設定してもだめ。