読者です 読者をやめる 読者になる 読者になる

たぷつきません

おなかがでてきた。もうたぷついてるやん。

恐怖、コンソールでログインしてログアウトしたら、落ちるTomcat

 これも、9月17日に実際に起きた話。なんだったんだこの日は...。あるIISTomcatクラスタ構成にしているお客さんのところで、運用者が差バーにリモートログインしてログオフしただけで、Tomcatが落ちるという恐ろしい現象が。
 いろいろ調べたところ、こちらの情報が完全マッチ!シグナルを送って実行時にスレッドダンプやメモリダンプなど障害解析できるようにするために、Tomcatサービスは使っていなかったことが原因だった。結局シグナル渡せなくなるのをあきらめて、-Xrs オプションをつけるようにして解決。 

-Xrs

(中略)

JVM は、コンソール制御イベントを監視して JVM の異常終了を検知することにより、シャットダウンのフックを実現します。具体的には、JVM は、シャットダウンフック処理を開始するコンソール制御ハンドラを登録し、CTRL_C_EVENT、CTRL_CLOSE_EVENT、CTRL_LOGOFF_EVENT、および CTRL_SHUTDOWN_EVENT に対して TRUE を返します。

(中略)

JVM がサービス (Web サーバ用のサーブレットエンジンなど) として実行されている場合、JVM は、CTRL_LOGOFF_EVENT を受け取ってもシャットダウン処理を開始してはなりません。そのとき、オペレーティングシステムは、実際にはプロセスを終了させないからです。この例のような障害の可能性を避けるため、J2SE 1.3.1 以降では -Xrs コマンド行オプションが追加されました。Sun の JVM で -Xrs オプションを使用すると、JVM は、コンソール制御ハンドラをインストールしません。この場合、JVM は、CTRL_C_EVENT、CTRL_CLOSE_EVENT、CTRL_LOGOFF_EVENT、および CTRL_SHUTDOWN_EVENT の監視と処理を行いません。

  • Xrs を指定した場合、次の 2 つの影響があります。

Ctrl + Break キーによるスレッドダンプを利用できない
シャットダウンフック処理の実行は、JVM が終了しようとしている時点で System.exit() を呼び出すなどして、ユーザコード側で行う必要がある

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

 ほとんどJRockItのためにやっていたんだけど、Oracleの策略で有償になったのでSun Javaに置き換え済みだった。頑張ってコンソールアプリの立ち下げするWindowsサービスを作ったのに、お役御免。