最近はビッグデータで遊んでいます。友人が私のところに来て、オンラインの 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 をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
目次1. 技術概要2. 技術的な詳細1. インターフェースからバックエンドデータを取得する2. フロ...
この記事はCentOS 7.3システム環境をベースに、MySQLとRedisのインストールと使用につ...
私は頻繁にシステムをインストールするので、インストールのたびにいくつかのソフトウェアを再インストール...
サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...
ReactとはReact は、効率的で高速なユーザー インターフェイスを構築するためのシンプルな J...
3つの仮想マシン132、133、134を群がらせる1. クラスターを初期化し、自分自身をクラスターに...
目次1. MySQLアーキテクチャの分析1.1 コネクタ1.2 クエリキャッシュ1.3 アナライザー...
セキュリティ上の理由から、MySql-Server はローカル マシン (localhost、127...
目次場合コンテキスト切り替えのオーバーヘッド?要約するCPU は多くの場合、システム パフォーマンス...
Vue 言語と要素コンポーネントを使用して、コード コンテンツの入力を必要とし、ハイライト表示が可能...
仕える: # chkconfig --list すべてのシステム サービスを一覧表示します # ch...
まずJDKをダウンロードします。ここではjdk-8u181-linux-x64.tar.gzを使用し...
序文この記事は主に Linux C でのログ出力コード テンプレートに関する関連コンテンツを紹介し、...
目次序文ミキシンMixin ノート (重複名)ローカルミックスイングローバル ミックスイン継承するミ...
質問Alibaba Cloud イメージを使用して Docker をインストールすると、次の図に示す...