あしのあしあと

2011-06-29

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

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

トラックバック - http://d.hatena.ne.jp/higher_tomorrow/20110629/1309356081