"jsvc"でTomcatをデーモンとして起動する

久しぶりにTomcatをインストールした際、jsvcコマンドの名前を思い出せなかったため備忘録。

jsvc(commons-daemon)でTomcatをデーモン起動

以前は、Tomcatの起動にstartup.sh/shutdown.shをrcスクリプトから呼び出していましたが、 ドキュメントの"Setup"にはjsvc(commons-daemon)が紹介されています。

Tomcat can be run as a daemon using the jsvc tool from the commons-daemon project.

jsvcを利用するメリットは、直接Tomcat(org.apache.catalina.startup.Bootstrap)を 制御(起動・停止)できるため、シンプルな設計になることです。

commons-daemonコンパイルする

先ほどメリットを説明しましたが、デメリットもあります。それはソースで配布されているため 自身でコンパイルする作業が必要になることです。とはいっても非常に簡単にコンパイルできます。

コンパイルに必要な環境は、gcc、gmake、autoconf、そしてJDKになります。

# yum install gcc make autoconf
JDKは使用するJavaによって変わりますが、ここではSun Java SE6 update27をインストールしました。
Download: Java SE - Downloads | Oracle Technology Network | Oracle
# chmod +x jdk-6u27-linux-x64-rpm.bin
# ./jdk-6u27-linux-x64-rpm.bin
# export JAVA_HOME=/usr/java/default

続いて、Tomcatを展開します。ここでは、Tomcat 6.0.33を使用しました。
# tar xvzf apache-tomcat-6.0.33.tar.gz
# mkdir -p /opt/apps
# mv ./apache-tomcat-6.0.33 /opt/apps/
# cd /opt/apps
# ln -s apache-tomcat-6.0.33 tomcat6

Tomcat6には、"commons-daemon-native.tar.gz"というファイル名でcommons-daemonのソースが添付されています。
# cd /opt/tomcat6/bin
# tar xvzf commons-daemon-native.tar.gz
# cd /opt/apps/tomcat6/bin/commons-daemon-1.0.7-native-src/unix
# ./configure
# make
# cp jsvc ../..

以上で、コンパイルと配置は完了です。

rcスクリプト

/etc/init.dにrcスクリプトを作成します。
なお、内容はソースディレクトリにある"sample/tomcat5.sh"を参考にCentOS5用に作成しました。
# cd /etc/init.d
# vi tomcat6
#!/bin/sh
# chkconfig: - 80 20
# description: tomcat6
# Source function library.
. /etc/init.d/functions

JAVA_HOME=/usr/java/default
CATALINA_HOME=/opt/apps/tomcat6
DAEMON=$CATALINA_HOME/bin/jsvc
TOMCAT_USER=root

# for multi instances adapt those lines.
TMP_DIR=/var/tmp
PID_FILE=/var/run/tomcat.pid
CATALINA_BASE=$CATALINA_HOME
LOCKFILE=/var/lock/subsys/tomcat

CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar

start() {
        #
        # Start Tomcat
        #
        echo -n "Starting Tomcat: "
        $DAEMON $JSVC_OPTS \
        -user $TOMCAT_USER \
        -home $JAVA_HOME \
        -Dcatalina.home=$CATALINA_HOME \
        -Dcatalina.base=$CATALINA_BASE \
        -Djava.io.tmpdir=$TMP_DIR \
        -wait 10 \
        -pidfile $PID_FILE \
        -outfile $CATALINA_HOME/logs/catalina.out \
        -errfile '&1' \
        $CATALINA_OPTS \
        -cp $CLASSPATH \
        org.apache.catalina.startup.Bootstrap
        #
        # To get a verbose JVM
        #-verbose \
        # To get a debug of jsvc.
        #-debug \
        RETVAL=$?
        if [ $RETVAL = 0 ]; then
                echo_success
                touch $LOCKFILE
        else
                echo_failure
        fi
        echo
}

stop() {
        #
        # Stop Tomcat
        #
        echo -n "Shutting Down Tomcat: "
        $DAEMON $JSVC_OPTS \
        -stop \
        -pidfile $PID_FILE \
        org.apache.catalina.startup.Bootstrap
        RETVAL=$?
        if [ $RETVAL = 0 ]; then
                echo_success
                rm -f $PIDFILE $LOCKFILE
        else
                 echo_failure
        fi
        echo
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        status)
                status $DAEMON
                RETVAL=$?
                ;;
        *)
                echo $"Usage: $0 {start|stop|restart|status}"
                exit 1
                ;;
esac

rcスクリプトを作成したら、サービス登録しOS起動時に自動起動するよう設定します。
# chkconfig --add tomcat6
# chkconfig tomcat6 on
# service tomcat6 start

コンパイル時にちょっとハマッた件

今回、OSはCentOS5.5 64bit版(CentOS-5.5-x86_64)を使用したのですが、jsvcを実行すると

jsvc error: Cannot find any VM in Java Home /usr/java/default
なるエラーメッセージが発生し、Tomcatを立ち上げることができませんでした。

原因は、誤って32bit版のJDKをインストールしてしまっていたためでした。 64bit版のJDKを入れなおすことによって回避できます。
参考:http://comments.gmane.org/gmane.comp.jakarta.tomcat.user/206762

以上。