セマフォによるTomcatの異常終了の解決方法

セマフォによるTomcatの異常終了の解決方法

最近はビッグデータで遊んでいます。友人が私のところに来て、オンラインの Tomcat が不可解に終了してしまうと言いました。彼は非常に困惑しており、私に助けを求めてきました。ログアウトしていることに気付くたびに、Tencent Cloud の WEB コンソールからログインし、Tomcat を起動していました。

他人を助ける(shao kao hao chi)という精神で、私は接続して分析を始めました。最初に行うことは、Tomcat ログをチェックして、関連する情報が記録されているかどうか、またどのように終了したかを確認することです。

ログから、Tomcat が終了要求を受信し、必要に応じてコンテナを閉じたことがわかります。では、誰かがshutdown.shを実行したと推測できますか?いいえ。シャットダウンスクリプトを実行した後のシャットダウンログは次のとおりです。

関連する Tomcat ソースコードのスクリーンショットは次のとおりです。スクリーンショットの左側に行番号があります。

tomcat が起動したら、シャットダウン命令が入力されるまで待機するように await を設定します。 org\apache\catalina\startup\Bootstrap.java

catalinaDaemon の定義は次のとおりです。

org\apache\catalina\startup\Catalina.java

インスタンス化する場合、インターフェース Server のインスタンスは StandardServer を指します。クラスパスは以下のとおりです。

org\apache\catalina\Server.java

org\apache\catalina\core\StandardServer.java

StandServer の出力関連ログのソースコードは次のとおりです。

読み取られる設定ファイルはorg\apache\catalina\core\LocalStrings.propertiesです。

Tomcat が適切なシャットダウン指示を受信すると、コンテナをシャットダウンする指示を受信したことを示すこのログが出力されます。

コンテナを閉じるための適切な指示、関連するコードは次のとおりです。

したがって、現在の証拠は、この Tomcat が SHUTDOWN メッセージによってシャットダウンされていないことを示しています。さらに、次の図は、SHUTDOWN コマンドを正常に発行することがそれほど簡単ではないことも示しています。

したがって、現時点で最も可能性の高い方法は、KILL コマンドを使用して操作することです。 bash スクリプトを実行するにはマシンにログインする必要があるので、そのときのログイン記録を wtmp と utmp から探してみてはいかがでしょうか。

以下はIPIPの結果です。

つまり、23日朝にtomcatが異常終了した際に、偶然にもTencent CloudのBGPデータセンターのアドレスもセッションを切断したことになる。友人のマシンはTencent Cloudに配置されています。ちょっと奇妙ですよね?

調査を続け、数日間連続して Tomcat ログを遡り、utmp と wtmp の結果を比較し、次に IPIP の結果を比較しましたが、結果はすべて同じでした。 Tencent Cloud BGP データセンターからのセッションが切断され、同時に Tomcat が終了します。秒単位の精度。これは何日も連続して何度も発生しており、Tomcat の終了と WEB セッションの終了の間に因果関係があることを示しています。

尋ねてみたところ、友人は WEB コンソールを使用してサーバーにログインすることに慣れていることを確認しました。Tomcat を起動した後、それを脇に置いてインターフェイスのデバッグを始めました。では、このような因果関係が生じる原因は何でしょうか?ここで、Linux システムの長年使用されているプロセス間通信メカニズムであるセマフォについて説明します。

セマフォに関する具体的な情報については、関連資料を参照してください。この問題については、単純にプロセス間通信のメカニズムとして理解することができます。

プロセス A はプロセス B に何かを実行することを必要としますが、プロセス間のメモリ領域は、ある意味では互いに見えません。このとき、セマフォを通じて完了する必要があります。プロセス A は、事前に定義されたセマフォ仕様に従って、プロセス B にセマフォを送信できます。プロセス B はそれを受信すると、セマフォの特定の値に基づいて処理ロジックを決定します。特定のセマフォ リストは、コマンド ラインで次のコマンドを使用して照会できます。コマンドはすべて文字で、数字の 1 は含まれません。

最も一般的なのは 9 の SIGKILL です。プロセスがこのセマフォを受信すると、そのプロセスは強制終了されます。このセマフォはオペレーティング システムによって処理され、アプリケーションでは処理できません。 Vista 以前の Windows システムでは、カーネルに侵入する方法がありました。このとき、WM_CLOSE などのメッセージを傍受して、プログラムが閉じられないようにすることができます。 win7やwin10の時代では、そのようなテクニックは使えなくなりました。

さらに、おなじみの CTRL + C 操作で SIGINT が送信されます。場合によっては、プログラムに正常に終了するように通知する必要があります。この場合、SIGQUIT (kill -3) を発行できます。

では、WEB コンソール セッションが切断されると、どのような信号が発行されるのでしょうか?試してみて確かめてみましょう。 Java は基盤となるシステムを操作することはできませんが、sun.misc パッケージには驚くべき機能がいくつかあります。コードは次のとおりです。

図に示すように、このコードはセマフォを受信するとスレッド名、セマフォ名を出力し、それを特定の番号に変換します。次に、メイン関数で、HUP、INT、ABRT、TERM の 4 つのセマフォを「登録」しました。何が出てくるかわからなかったので、とりあえず可能性のあるものをすべて登録しておいた4種類を登録しました。

コンパイルしてパッケージ化します。ここで注意すべき問題が 1 つあります。セマフォはオペレーティング システムの基盤となるメカニズムに属しているため、サポートされるセマフォはオペレーティング システムごとに異なります。JVM は、private static native int findSignal(String paramString) を通じてサポートを提供します。ネイティブ メソッドには特定の VM 実装が含まれるため、コードは投稿しません。しかし、Windows と Linux は当然異なると考えるのは簡単です。したがって、ここでは上部のコンピューターで書き込み、下部のコンピューターでデバッグする必要があります。 Windows で実行中にエラー メッセージが表示されても慌てないでください。

残りは簡単です。プログラムをサーバーにアップロードし、WEB コンソールからサーバーにログインし、実行結果をテキスト ファイルにリダイレクトして、コンソールがタイムアウトするまで待ちます。結果は以下の通りです。

結果を分析する必要はありません。WEB コンソールは終了時に SIGHUP を発行します。これは kill -1 と同等です。 SIGHUP を受信すると、Tomcat はどのような動作をしますか? -1 pid を kill してログを調べれば理解できるでしょう。

解決策は実はとても簡単です。 SIGHUP は HANG UP を意味します。nohup xx.sh & を使用すると、SIGHUP と SIGINT を完全にブロックできます。また、テストの結果、SecureCRT タブ ページの右側にある × をクリックしてもセマフォをトリガーできることがわかりましたが、直接ログアウトしたり、メニューの赤い十字をクリックしてもセマフォはトリガーされません。

興味のある友人はこのプログラムを拡張してテストすることができます。異常終了の問題が解決できるかもしれません。

この問題の解決は上海 ZTO の Liu Jiangang 氏と切り離せないものであり、彼に特に感謝します。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Tomcat の一般的な例外と解決コードの例
  • SpringBoot プロジェクトがパッケージ化され、外部の Tomcat に公開されます (さまざまな例外を解決)
  • Tomcat での jar のロードに関する異常な問題の分析と解決
  • tomcat6 の jsp でこの応答に対して getOutputStream() が既に呼び出されている例外の原因と解決策
  • tomcat の起動時にエラーが発生しました: プロキシが例外をスローしました: java.rmi.server.ExportException: ポートは既に使用されています: 1099 解決策
  • idea2020.2 が pom.xml ファイル Maven プラグイン tomcat7 でエラーに遭遇する問題を解決する
  • IDEA 構成の Tomcat 起動エラーの問題を解決する
  • SSM プロジェクトを Idea にインポートした後、Tomcat を起動するとエラー 404 が発生する問題を解決します。
  • Tomcat 起動エラー: java.util.zip.ZipException の解決方法
  • Tomcat 例外の解決方法 (リクエスト ターゲットに無効な文字が見つかりました。有効な文字は RFC 7230 および RFC 3986 で定義されています)

<<:  メンテナンス可能なJSコードの書き方を教えます

>>:  JQuery を放棄すべきでしょうか?

推薦する

@font-face を使用して Web ページに特殊文字を実装する (カスタム フォントを作成する)

数日前、CSS を使用して三角形の矢印を実装する方法について記事を書きました。 目的の効果は達成され...

MySQL ルートパスワードを変更する複数の方法 (推奨)

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...

CentOS に MySQL 5.5 をインストールするための完全な手順

目次1. インストール前の準備、インストールパッケージのダウンロード1 インストールの準備2 インス...

Centos 7.4 サーバーの時刻同期設定方法 [NTP サービスに基づく]

この記事では、CentOS 7.4 サーバーで時刻同期を構成する方法について説明します。ご参考までに...

HTML 学習ノート - HTML 構文の詳細な説明 (必読)

1. HTML マークアップ言語とは何ですか? HTML は、Web ページの情報を表すマークアッ...

WeChat アプレット学習 WXS 使用方法チュートリアル

wxsとは何ですか? wxs (WeiXin Script) は、小規模プログラム用のスクリプト言語...

MySQLデータベース操作の基本コマンド

1. データベースを作成します。 データ data _name を作成します。 PHP でデータベー...

CSS のサイズと幅と高さのブラウザ解釈の違いに対する解決策

まずは例を見てみましょうコードをコピーコードは次のとおりです。 <!DOCTYPE html ...

Javascript 文字列メソッドの詳細な説明

目次文字列の長さ: 長さcharAt() charCodeAt()文字列に値が含まれているかどうかを...

Dockerのローカルイメージ作成方法の分析

コンテナと呼ばれるものは、実際には親イメージに基づいて読み取りおよび書き込み可能なファイル階層を作成...

HTML 内の CSS および JS リンクのバージョン番号 (キャッシュを更新)

背景検索エンジンで「.htaccess キャッシュ」というキーワードを検索すると、ウェブサイトのファ...

JS ES6コーディング標準の詳細な説明

目次1. ブロックスコープ1.1. let は var を置き換える1.2. グローバル定数とスレッ...

MySQLのユーザーアカウント管理と権限管理の詳細な説明

序文MySQL の権限テーブルは、データベースの起動時にメモリにロードされます。ユーザーが ID 認...

Linux\Nginx 環境での仮想ドメイン名の設定とテスト検証

Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...

CentOS7にNginxを素早くインストールする方法を教えます

目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...