CentOS では、Catalina.sh を使用して Tomcat の実行時を管理します。Catalina.sh run を実行した後、生成された Tomcat プロセスは Catalina.sh stop -force を使用して正常に停止できません。Catalina.sh のデフォルトの内容で Tomcat サービスを構成している場合、/etc/init.d/tomcat stop も無効になります。
Catalina.sh ファイルを確認した後、以下のコードを見つけました。実際に停止するには、CATALINA_PID ファイルが必要です。Catalina.sh の 468 行目
if [ ! -z "$CATALINA_PID" ]; then
if [ -f "$CATALINA_PID" ]; then
if [ -s "$CATALINA_PID" ]; then
kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
if [ $? -gt 0 ]; then
echo "PID ファイルが見つかりましたが、一致するプロセスが見つかりませんでした。停止が中止されました。"
exit 1
fi
else
echo "PID ファイルが空であり、無視されました。"
fi
else
echo "\$CATALINA_PID が設定されていますが、指定されたファイルが存在しません。Tomcat は実行中ですか?停止が中止されました。"
exit 1
fi
fi
CATALINA_PID の説明内容 Catalina.sh の 89 行目
# CATALINA_PID (オプション) catalina 起動 java プロセスの pid を含むファイルのパス
start(fork)が使用される場合#
解決策は、Catalina.sh の環境変数を設定する際に、CATALINA_PID 変数を追加することです。
#pid ファイルを作成する
touch /usr/local/tomcat/logs/tomcat.pid
/etc/init.d/tomcat のヘッダーに環境変数の設定を追加する#
sed -i '1a\. /etc/init.d/functions' /etc/init.d/tomcat
sed -i '2a\:' /etc/init.d/tomcat
sed -i '3a\JAVA_HOME=/usr/local/jdk' /etc/init.d/tomcat
sed -i '4a\CATALINA_BASE=/usr/local/tomcat' /etc/init.d/tomcat
sed -i '5a\CATALINA_HOME=/usr/local/tomcat' /etc/init.d/tomcat
PID ファイルの場所を追加する#
sed -i ‘6a\CATALINA_PID=/usr/local/tomcat/logs/tomcat.pid' /etc/init.d/tomcat
最後に、Catalina.sh を使用して Tomcat を単独で実行する場合は、$CATALINA_HOME/bin に setenv.sh を作成する方法をお勧めします。
参考 http://lovesoo.org/tomcat-process-fails-to-stop-problem-solving.html