catalina.sh の主だったところをメモ

仕事で色々問題があって Tomcat の catalina.sh を初めてちゃんと読んだ。で、その時はわかったことをまとめる時間がなかったので、今になって(一応)メモ。まぁ、たいした内容でもない。
仕事では 6.0.x だったが、折角なので最新版をと Tomcat 7.0.16 の catalina.sh を再度読むことにした(といっても500行強なので、すぐに終わる)。

(1) catalina.sh とは

Tomcat の起動/停止スクリプトTomcat のインストールディレクトリの下、bin の配下にいる。
このスクリプトで、Bootstrap#main に start とか stop とかつけて実行する(Javaのプロセスを起動する)。起動時(Bootstrap#main start)に、停止リクエストを受け付けるポートをバインドする(ポートおよびシャットダウン用のパスワードは、server.xml で設定できる)。なので、停止時(Bootstrap#main stop)には、server.xml を読み込んで、停止用のリクエストを投げるだけ。ちなみに、手元で上げ下げする時によく使う startup.sh とか shutdown.sh は、catalina.sh を呼んでいるだけ。
ココで作成したような、/etc/rc.d/init.d 以下に配置する起動/停止スクリプトを作成する場合には、スクリプト中から直接 catalina.sh を呼ぶので、その仕様を知っておく必要がある(と思う)。

(2) 指定できる環境変数

指定できる環境変数は、ヘッダコメントに書いてあるので、まぁそれを見ればよい。ここでは、とてもとても指定したくなる環境変数を3つ紹介する。

1) クラスパス

まんま CLASSPATH。これは追加で指定したいでしょう。でも、catalina.sh 中でクリアされてしまう。なので、このスクリプトの外部からは指定できない。で、catalina.sh から呼ばれるスクリプトに、setclasspath.sh と setenv.sh がある。
setclasspath.sh には、デフォルトで色々書いてあるから、変更したくない(そもそも、既存のファイルに手を入れたくない)。こんな名称のくせに。。
bin の下に setenv.sh を作っておくと読んでくれるので、ここに指定するのがよいのではないかと思う(デフォルトでは setenv.sh は存在しない)。

2) Java VMの起動オプション

CATALINA_OPTS と JAVA_OPTS の2つがある。CATALINA_OPTS は起動時のみに指定される。JAVA_OPTS は起動時にも停止時にも指定される。なので、JMXのオプションとか、メモリのオプションとか、そういったのは、CATALINA_OPTS に指定しなければならない。ちなみに、間違えて JAVA_OPTS にJMXリモートのオプションを指定したものだから、Tomcat 停止時にも(起動時と同じ)ポートをオープンしようとして、停止処理が必ず異常終了するという事態に。。

3) PIDファイル

起動/停止スクリプトを作る場合には、PIDファイル*1を作りたい(よね)。そんな時は、CATALINA_PID にファイル名を設定しておく。そうすると、catalina.sh の中で、PIDファイルの作成、削除を実施してくれる。

(3) 指定できる引数

引数は、スクリプトの最後に usage が書いてある(引数の指定を誤って実行すれば、コンソールに出てくる)。ここでは、とてもとても指定したくなる引数を3つ紹介する。

1) catalina.sh run [-security]

スクリプトを実行したコンソールで、そのままプロセスが起動する。PIDファイルなぞガン無視(作成されない)。手元で実行する時など、とにかく起動して、起動時の標準出力をコンソールに垂れ流したい時には、この引数で。で、「Ctrl+C」で落とす♪

2) catalina.sh start [-security]

きちんとバックグラウンドで実行したい時には、この引数で。ちゃんとPIDファイルが作成される。

3) catalina.sh stop [n] [-force]

Tomcat の停止処理を実行後、n 秒(指定しないと5秒)間、PIDファイルに記載があるプロセスの有無をチェック*2し、プロセスがいなくなったら、PIDファイルを削除する。なお、次の場合にはPIDファイルが消えない。

  • n 秒(指定しないと5秒)以内に Tomcat が停止しなかった場合*3
  • Tomcat の停止処理中にエラーが発生した場合*4

“-force”オプションをつけると、上記により Tomcat が落ちていない場合に、SIGKILL 送ってプロセスを強制終了し、PIDファイルも消してくれる。でも、停止処理中にエラーが発生したことに気がつきにくいから、あまりおすすめできない。

*1:プロセスIDが記載されただけのファイル。起動、停止の状態を判断したり、プロセスを強制終了したりする場合に用いる。

*2:“kill -0 <pid>”の戻り値で判定する。

*3:大概1〜2秒で停止する。

*4:前述したように、停止中に使用中のポートをバインドしようとした時や、起動直後でシャットダウン用のポートがオープンする前に、シャットダウンリクエストを投げてしまった場合など。