2010年10月7日木曜日

service.bat を使わないで Tomcat 7.0.2 を Windows サービスに登録する

ことの発端

Tomcat 7 では Windows 用の配布物をダウンロードした場合サービスに登録する際は次の要領で %CATALINA_HOME¥bin¥service.bat を実行するだけ。

C:\>%CATALINA_HOME%\bin\service.bat install
Installing the service 'Tomcat7' ...
Using CATALINA_HOME:    C:\Program Files\Tomcat\tomcat7
Using CATALINA_BASE:    C:\Program Files\Tomcat\tomcat7
Using JAVA_HOME:
Using JVM:              auto
The service 'Tomcat7' has been installed.


でも、何らかの理由で Windows 用のではない配布物をダウンロードしてしまった場合や変更が加えられた二次配布 Tomcat を使用する場合、あるいは service.bat を管理者権限で実行出来ない場合など、別の方法でサービス登録をしなくちゃいけない。
どうやるんだろう?

Windows インストーラではどのようにサービス登録しているか

まず Tomcat は本来どのようにサービス登録しているか見てみる。

windows インストーラで Tomcat 7.0.2 をインストールしてみると %CATALINA_HOME¥bin に

Tomcat7.exe 
Tomcat7w.exe
bootstrap.jar
tomcat-juli.jar

のみ含まれている。
色々調べてみると、この Tomcat7.exe, Tomcat7w.exe は Apache commons daemon で配布されている Procrun.exe を rename したものらしい( see at http://commons.apache.org/daemon/procrun.html )。基本的にはこの Procrun.exe を使えばサービスに登録出来そう。

Tomcat で使用しているパラメータを調べる

Tomcat は独自にパラメータを付与している可能性があるので、Taomcat のマニュアル Windows service HOW-TO を参考にする。

と、このマニュアルの前半はどうやら Procrun のマニュアルをそのままコピーしただけの様なので Installing_services から読み始める。

ちょうど良くコマンド例が記載されているのでこれを実行。

C:\> tomcat7 //IS//Tomcat7 --DisplayName="Apache Tomcat 7" \
C:\> --Install="C:\Program Files\Tomcat\bin\tomcat7.exe" --Jvm=auto \
C:\> --StartMode=jvm --StopMode=jvm \
C:\> --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start \
C:\> --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop
c:\>

何のエラーも無くすんなり完了。
試しに Tomcat7 サービスを起動してみると…

Tomcat7 は次のサービス固有のエラーで終了しました: 0 (0x0)

と、エラーが発生して起動せぬまま終了。
イベントビューアを見てみても同じログしか出力されていない。
…もしかしたらパラメータが足りないのかも知れない…。

もう一度、サービス登録時に付与したパラメータを確認すると StartClass と StopClass を指定しているのに Class Path を指定していない。パラメータを追加するためマニュアルの Updating services を見てみると、ClassPath パラメータ付与してるし!最初から付与しておいてよ orz

C:\> tomcat7 //US//Tomcat7 --Description="Apache Tomcat Server - http://tomcat.apache.org/ " \
C:\> --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar

と、サービスを更新して再度起動してみる・・・。

Tomcat 7 サービスは予期せず終了しました。(エラー 1067)

がっかり。
まだパラメータが足りないのかと思い、マニュアルを読み進めてみたが何も記載が無い。
イベントビューアを見てみたけれど上記と同じログが出力されているだけ。
いよいよお手上げ。

Windows インストーラとの違いを探る

同じ EXE を使っているのだから同様にサービス登録できるはず!
ということで、一度 Windows インストーラでレジストリに登録された情報を見てみる。
と、HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java に次の Options というパラメータがあるのに対して、手動で登録したものにはこのパラメータがない。
どうやらこれが肝らしい。

-Dcatalina.home=C:\Program Files\Tomcat;
-Dcatalina.base=C:\Program Files\Tomcat;
-Djava.endorsed.dirs=C:\Program Files\Tomcat\endorsed;
-Djava.io.tmpdir=C:\Program Files\Tomcat\temp;
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;
-Djava.util.logging.config.file=C:\Program Files\Tomcat\conf\logging.properties;

このパラメータの値は ";" で区切られていて、それぞれの頭に "-D" が付いている。
これは --JvmOptions で付与すべきなのかな。
とりあえずやってみた。

C:> sc delete Tomcat7
C:> tomcat7 //IS//Tomcat7 --DisplayName="Tomcat7" --Jvm="C:\Program Files\Java\jdk1.6.0_18\jre\bin\server\jvm.dll" --JvmOptions="-Dcatalina.home=C:\Program Files\Tomcat;-Dcatalina.base=C:\Program Files\Tomcat;-Djava.endorsed.dirs=C:\Program Files\Tomcat\endorsed;-Djava.io.tmpdir=C:\Program Files\Tomcat\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=C:\Program Files\ApacheGroup\apache-tomcat-7.0.2\conf\logging.properties" --Classpath="C:\Program Files\Java\jdk1.6.0_18\lib\tools.jar;C:\Program Files\Apache Group\apache-tomcat-7.0.2\bin\bootstrap.jar;C:\Program Files\Tomcat\bin\tomcat-juli.jar" --StartMode=jvm --StopMode=jvm --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop --Startup=auto

何のエラーも無くすんなり完了。
試しに Tomcat7 サービスを起動してみると…無事起動。

まとめ

今回の結果を次にまとめてみた。
  • サービス登録には Procrun を使う
  • 基本登録コマンドは Installing_services に記載されているコマンドを使用
  • さらに --ClassPath オプションで JVM と bin に含まれている jar を加える
  • さらに --JvmOptions オプションでシステムパラメータを加える

1 件のコメント:

  1. apache-tomcat-7.0.37.exe と jdk-7u17の組合せで、startup.batでは起動するのに、service.batで登録したサービスが
    FindClass org/apache/catalina/startup/Bootstrap failed
    と起動しないという状況に陥っており、しらべているうちにこちらにたどり着きました。
    海外でも多数質問が上がっているようですが、明確な解決は見つかりませんでした。
    こちらのブログを参照しせ設定しました結果、うまくサービスが起動するようになりましたので、お礼と共に、他にも困っている方のために解決方法を記載させて下さい。

    service.bat を使用しtomcatをサービスとして登録しても、サービスがエラーで開始できない場合、
    まず、環境変数に%CATALINA_HOME%、%JAVA_HOME%が設定されていること、
    %JAVA_HOME%\binにパスが通っていることを確認して下さい。
    コマンドプロンプトより
    %CATALINA_HOME%\bin\tomcat7w.exe //ES
    でTomcat7のPropatiesのダイアログを出して、
    Javaのタブの中の
    Java Classpathに
    %JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_HOME%\bin\tomcat-juli.jar
    をいれて、OKを押して下さい。
    これでTomcatのServiceが開始できるようになると思います。

    @kioさんありがとうございました。

    返信削除