実稼働サーバー(Linux CentOS 4.8)で夜間に停止するTomcat 5.5に問題があり、停止する理由がわかりません... catalina.outまたはアプリケーションのログにTomcatのログがありません。
サーバーが停止する理由を見つけるために、さまざまなことを試みました。
System.exit()
メソッドRuntime.getRuntime().addShutdownHook()
を使用)それらはどれも機能せず、コアダンプがなく、Exitメソッドとシャットダウンフックは呼び出されません。私の結論は次のとおりです。
Tomcatが停止する理由を見つけるために読むアイデアやログはありますか?
1)stderrがリダイレクトされる場所を確認し、そこに何かが印刷されていないかどうかを確認します。
2)Tomcatのメモリ制限と、システムにどれだけの空きメモリがあるかを確認します。/var/logの下にあるLinuxシステムログを確認して、その間に疑わしいことが発生したかどうかを確認します。たとえば、システムのメモリが不足している場合、カーネルはトレースなしでプロセスを(ほぼ)ランダムに強制終了できます。
私たちは何年もの間5.5を本番環境で実行してきましたが、原因不明のシャットダウンは一度もありませんでした、FWIW。
これは私のために働いた。
ここで他の回答で示唆されているように、チェックされたシステムログは/var/log/messages
しかし、許可は私には拒否されました。そこで、代わりにdmesg
コマンドを使用して、これをログに記録しました
「メモリ不足:プロセス14606(Java)スコア106を強制終了するか、子を犠牲にします」。
出力では、スワップメモリ空き0 Kにも気づきました。 top
コマンドを実行して同じことを確認しました。そのため、どういうわけかメモリ使用量が多く、OSがTomcatプロセスを強制終了しました。
何時間も費やした後、ついに理由がわかりました。
ps -ef | grep Tomcat
は、同じアプリケーションに対して複数のTomcatプロセスが実行されていることを示しました。以前のTomcatのシャットダウンが正常に完了しなかった可能性があり、何らかの理由でシャットダウン後もプロセスが強制終了されなかったため、メモリ使用量が多かったようです。
したがって、kill
を使用して実行中のすべてのTomcatプロセスを強制終了しました。 SWAPメモリが解放されました。
Tomcatを再起動し、正常に動作しました。 :)
ほとんどの場合、スタックオーバーフローの例外があります。これは、Tomcatが発生したときの典型的な動作です。たとえば、循環依存関係のあるJSONまたはXML Beanにシリアル化しようとしています(ただし、サイクルを処理しません)。
私がこの問題を抱えるたびに(数回)、それはいつもこれでした。他のすべての停止は通常、適切にログに記録されます(OutOfMemoryなど)。
このタイプのストップはどこにも痕跡を残しません。
Tomcat 7には、System.exitクラスの呼び出しなどを防ぐためのcatalina内のオプションがあります。 http://ci.Apache.org/projects/Tomcat/tomcat7/docs/security-manager-howto.html =。
たぶん、5.5バージョンにも同様のオプションがあります。ドキュメントをお試しください。
Tomcatの起動に使用するのと同じコンソールに出力をリダイレクトするオプションがあります。この情報は、Unixベースのシステムで実行するとログにリダイレクトされます。Windowsでは、リダイレクトされない場合はコンソールに残ります。