Webアプリをしばらく実行した後(タイミングはトラフィックによって数時間から数日の間で異なります)、Tomcatはランダムにシャットダウンするようです。これが発生する前に、ログに異常なことは何もありません(例外はありません)。私のアプリが出力する通常のINFOのものだけです。
誰かがこれをデバッグするための最良の方法を手伝ってもらえますか? TomcatにAbstractProtocol pause
信号をトリガーするものはありますか?
ログ:
09-Nov-2011 21:40:19 org.Apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-80"]
09-Nov-2011 21:40:20 org.Apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
09-Nov-2011 21:40:21 org.Apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
Javaバージョン:1.6.0_25-b06 Tomcatバージョン:6
私はこれが以前に起こるのを見ました、そしてログは時々不可解であるかもしれません。ポート80(これはまったく別の問題です)で実行していることに気づきました。これにより、server.xmlが変更されたと思われます。サーバー上に複数のTomcatインスタンスがある場合は、それらすべてに一意のシャットダウンポートがあることを確認してください。標準ポートは8005であり、複数のインスタンスが同じポートでリッスンしている場合は、両方を停止することができます。
コードまたは活用されたライブラリにランダムなSystem.exit()が存在するか、コード内の真のエラーメッセージを不適切に抑制している可能性があります。私は、人々がこれをエラー処理の形式としてコントローラーに書き込むことを何度も見てきました。
try {
// Do something
} catch(Exception e) {
// No rethrowing or logging, just suppressing
}
これにより、真のエラーが発生したり、適切なログが記録されたりするのを防ぎます。
また、Tomcatサーバーがメモリ制限に達すると機能を停止することもあります。ログのどこかにヒープスペースエラーがありますが、何らかの理由でそれが非常に簡単に埋もれてしまう可能性があり、残っているのは一時停止メッセージだけです。 catalina.out以外にlocalhost.logを調べることは価値があるかもしれません。通常、そこにはゴミが少なくなります。
本番ボックスで作業している場合、または迅速/一時的な修正が必要な場合は、server.xmlのシャットダウンポートを「-1」に設定すると、shutdownコマンドが無効になります。これにより、同じシャットダウンポートを持つ可能性のある他のアプリがTomcatインスタンスにシャットダウンシグナルを送信することはありません。ただし、この設定では、Tomcatをシャットダウンするのではなく、強制終了する必要があります。それは悪い部分です。
カスタムスクリプトが(Nohupなしで)元のstartup.shを開始し、時間のかかる作業を続けたため、Tomcatが不思議なことにシャットダウンしていました。カスタムスクリプトを呼び出した人は、ctrl-Zを使用してそれをバックグラウンドに置き、PuTTYターミナルを閉じました。これにより、端末に接続されているすべてのプロセスにSIGHUPが送信され、Tomcatがシャットダウンされました。
TomcatがSIGHUPの受信に関するメッセージを出力したことを望みます。後でこのリンクを見つけて、分析を確認しました。
Logrotateが「kill-HUP」をApacheプロセスに送信し、TomcatがApacheによって生成された場合、この問題が発生します。Apacheは、HUPシグナルを受信すると、すべての子を強制終了します。