【概要】
/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にて、もし、$CATALINA_PIDが宣言されていれば、$!(特殊変数で、バックグラウンドで実行された直前のプロセスのプロセス番号)を$CATALINA_PIDに書き込む。
echo $! > $CATALINA_PID
fi
という流れ。
【試行錯誤】
$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と、スクリプトを立ち上げたユーザーとは別のユーザーでtomcatを立ち上げていたんですね。
su - ${user} -c ${script}
または
daemon --pidfile ${CATALINA_PID} --user ${user} ${script} start
とすれば必要なことは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を立ち上げるユーザー(もしくは全ユーザーとかなんでもいいけど)の環境変数に
を書く(必要ならCATALINA_OPTSも。用意しないと書かれない)。export CATALINA_PID="/var/run/tomcat.pid"
【悩み: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