2025年6月29日日曜日

Apache Tomcatの起動状態がstoppedと表示される現象の解説と解決策


Apache Tomcatを運用していると、Webサイトは問題なく稼働しているにもかかわらず、sudo /etc/init.d/tomcat statusコマンドを実行すると**「stopped」と表示されてしまう**という奇妙な現象に遭遇することがあります。今回はこの現象の原因と、その解決策について詳しく解説します。

現象の概要

この現象は、Tomcatが正常に動作しているにもかかわらず、システム起動スクリプトがTomcatプロセスを正しく認識できないために発生します。結果として、statusコマンドの出力は「stopped」となり、管理上混乱を招く可能性があります。

原因:psコマンドの出力文字数制限

この問題の根源は、/etc/init.d/tomcatスクリプト内でTomcatプロセスを検出するために使用されているpsコマンドのオプションにあります。具体的には、以下の行が関係しています。

INSTANCES=`ps --columns 512 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`



このコマンドは、システム上で実行されているプロセスの中からTomcatに関連するものを検索しています。ポイントは--columns 512というオプションです。これはpsコマンドの出力行の最大文字数を512文字に制限するものです。

Tomcatの起動時には、そのプロセス情報(特にJavaの起動オプションなど)が非常に長くなることがあります。もしTomcatの起動コマンドラインが512文字を超えてしまうと、ps --columns 512 -aefの出力では、その長いコマンドラインが途中で切り詰められてしまいます。

なぜ問題になるのか?

Tomcatのプロセスを特定するために、スクリプトは切り詰められたpsの出力に対してさらにgrep org.apache.catalina.startup.Bootstrapというフィルタリングを行っています。しかし、もしorg.apache.catalina.startup.Bootstrapという文字列が、--columns 512によって切り詰められた部分よりも後ろに位置していた場合、grepはその文字列を見つけることができません。

結果として、スクリプトはTomcatプロセスが稼働していないと判断し、「stopped」と表示してしまうのです。

解決策:--columnsオプションの調整または削除

この問題を解決するには、/etc/init.d/tomcatスクリプト内のpsコマンドから--columns 512オプションを削除するか、より大きな値に変更します。

1. --columns 512を削除する

最も簡単な方法は、このオプションを完全に削除することです。これにより、psコマンドはプロセス情報を切り詰めることなく完全な形で出力するようになります。

# 変更前

INSTANCES=`ps --columns 512 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`


# 変更後

INSTANCES=`ps -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`



2. --columnsの値を増やす

もし何らかの理由で--columnsオプションを残したい場合は、Tomcatの起動コマンドラインが確実に収まるような十分大きな値(例: 1024や2048など)に変更します。

# 変更前

INSTANCES=`ps --columns 512 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`


# 変更後(例: 2048に変更)

INSTANCES=`ps --columns 2048 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`



変更後の確認

スクリプトを修正したら、Tomcatを再起動する必要はありません。そのままsudo /etc/init.d/tomcat statusコマンドを実行し、今度は「running」と正しく表示されることを確認してください。

この現象は少し戸惑うかもしれませんが、原因を理解して適切な修正を行うことで、Tomcatの運用状況を正しく把握できるようになります。