火曜日, 12月 03, 2013

tomcat 5.5系 pidfileにプロセス番号が書かれない!けど解決した件


【概要】
/etc/init.d/tomcatからtomcatを立ち上げても、pidファイルにプロセス番号が書き込まれないので困っていた。
けど調査後解決したので、備忘録を書いてみる(日本人なので結論は最後に)。

※ここはtomcat5系のスタートアップの話でして、jsvcの話は出てきません、あしからず。




【tomcatがpidfileにプロセス番号を書き込むまで】

  • /etc/init.d/tomcatが、"/usr/local/tomcat/bin/startup.sh" または"/usr/local/tomcat/bin/catalina.sh start"を起動する。
  • startup.shは"catalina.sh start"を起動する。
  • catalina.shの第一引数がstartの場合、

285行目 elif [ "$1" = "start" ] ; then
に飛び、さらに304~306行目、または316~318行目の
if [ ! -z "$CATALINA_PID" ]; then
   echo $! > $CATALINA_PID
fi
にて、もし、$CATALINA_PIDが宣言されていれば、$!(特殊変数で、バックグラウンドで実行された直前のプロセスのプロセス番号)を$CATALINA_PIDに書き込む。

という流れ。




【試行錯誤】
$CATALINA_PIDが必要なので、/etc/init.d/tomcatに、以下のような環境変数のエクスポートを追加した。
prog=tomcat
CATALINA_PID="/var/run/${prog}.pid"
export CATALINA_PID
user=abc
script=/usr/local/tomcat/bin/startup.sh
su - ${user} -c ${script}
または
daemon --pidfile ${CATALINA_PID} --user ${user} ${script} start

これで行けると思いきや、書き込まれなかった。
そこでcatalina.shの上記if文に、変数があろうがなかろうが書き込めるように書いてみたところ…
if [ ! -z "$CATALINA_PID" ]; then
   echo $! > $CATALINA_PID
fi
echo $! > /var/run/tomcat.pid
無事書かれた! なんだよー環境変数かよー!
/etc/init.d/tomcatにexport CATALINA_PID書いてたじゃん!!!
と、自分のスクリプトを見直してみると…
user=abc
su - ${user} -c ${script}
または
daemon --pidfile ${CATALINA_PID} --user ${user} ${script} start
と、スクリプトを立ち上げたユーザーとは別のユーザーtomcatを立ち上げていたんですね。
とすれば必要なことは2つ。スタートアップスクリプトで、tomcatを立ち上げるユーザー権限で/var/run/tomcat.pidを用意するのと、tomcatを立ち上げたいユーザーのenvに
CATALINA_PID=/var/run/tomcat.pid
が見られる状態にすれば大丈夫。今回は立ち上げユーザーの.bashrcに直接書いてみた。
---
export CATALINA_PID="/var/run/tomcat.pid"
---

※いろんなブログを見て回ると、/etc/init.d/tomcatで
「pgrep -f tomcat > $CATALINA_PID」なんてやって直接書いているのも散見したけど、
たぶんこの「別ユーザーで立ち上げてからの環境変数がない問題」なのかなー、と思ってます。



【結論】
tomcatをスタートアップスクリプトで立ち上げて、pidfileにプロセス番号が書かれないときは、以下2つを確認すること。


  • スタートアップスクリプトで、pidfileを用意してあげること(以下例。用意しないと権限エラー)。
        touch ${CATALINA_PID}
        chown ${user}:${user} ${CATALINA_PID}
  • tomcatを立ち上げるユーザー(もしくは全ユーザーとかなんでもいいけど)の環境変数に
export CATALINA_PID="/var/run/tomcat.pid"
       を書く(必要ならCATALINA_OPTSも。用意しないと書かれない)。




【悩み:tomcatと/etc/rc.d/init.d/functionsのdaemonの間柄】

/etc/init.d/tomcatから、
「daemon --pidfile ${CATALINA_PID} --user ${user} ${script} start」
で立ち上げ
「daemon --pidfile ${CATALINA_PID} --user ${TOMCAT_USER} ${TOMCAT_SCRIPT} stop」
で落とそうと思ったけど、上がるけど、落とすときがうまくない。
なんで?と思っているけど、未調査なので、現状startup/shutdownを使っています。



end