セマフォによる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 を放棄すべきでしょうか?

推薦する

Vueのフロントエンドとバックエンドのデータのやり取りと表示を理解する方法

目次1. 技術概要2. 技術的な詳細1. インターフェースからバックエンドデータを取得する2. フロ...

Docker に MySQL と Redis をインストールする方法

この記事はCentOS 7.3システム環境をベースに、MySQLとRedisのインストールと使用につ...

MySQL5.7.21 解凍版インストール詳細チュートリアル図

私は頻繁にシステムをインストールするので、インストールのたびにいくつかのソフトウェアを再インストール...

JavaScript はパスワードボックスの入力検証を実装します

サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...

HTMLからReactを実装する方法を教えます

ReactとはReact は、効率的で高速なユーザー インターフェイスを構築するためのシンプルな J...

Docker swarm の簡単なチュートリアル

3つの仮想マシン132、133、134を群がらせる1. クラスターを初期化し、自分自身をクラスターに...

MySQL では SQL ステートメントはどのように実行されますか?

目次1. MySQLアーキテクチャの分析1.1 コネクタ1.2 クエリキャッシュ1.3 アナライザー...

MySQLリモート接続を有効にする方法

セキュリティ上の理由から、MySql-Server はローカル マシン (localhost、127...

Tomcat プロセスの CPU 使用率が高い場合の解決策

目次場合コンテキスト切り替えのオーバーヘッド?要約するCPU は多くの場合、システム パフォーマンス...

Vueはコードのハイライトを実現するためにモナコを使用しています

Vue 言語と要素コンポーネントを使用して、コード コンテンツの入力を必要とし、ハイライト表示が可能...

Linuxターミナルでの一般的なMySQL操作コマンドの詳細な説明

仕える: # chkconfig --list すべてのシステム サービスを一覧表示します # ch...

Linux CentOS インストール JDK および Tomcat チュートリアル

まずJDKをダウンロードします。ここではjdk-8u181-linux-x64.tar.gzを使用し...

Linux C ログ出力コード テンプレート サンプル コード

序文この記事は主に Linux C でのログ出力コード テンプレートに関する関連コンテンツを紹介し、...

Vueのミックスインと継承について詳しく説明します

目次序文ミキシンMixin ノート (重複名)ローカルミックスイングローバル ミックスイン継承するミ...

Alibaba Cloud に Docker をインストールする際の問題と解決策

質問Alibaba Cloud イメージを使用して Docker をインストールすると、次の図に示す...