最近はビッグデータで遊んでいます。友人が私のところに来て、オンラインの 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 をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
MySQL を自分でインストールするのに 3 時間かかりました。チュートリアルはたくさんあるにもかか...
1. 背景Sysbench は、システムのハードウェア パフォーマンスをテストできるストレス テスト...
次のコマンドを実行します: glxinfo | grep レンダリング結果が「はい」の場合、グラフィ...
Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...
SSHとは何か管理者はリモートでログインして、インターネット経由で接続されたさまざまな場所にある複数...
nginx をコンパイルしてインストールし、一定期間使用した後、現在のバージョンに脆弱性があることや...
Vue での img の動的スプライシングを見てみましょう。src 画像アドレス、具体的な内容は次の...
目次1. 浅いクローニング2. ディープクローニング1. 浅いクローニング浅いクローンでは配列やオブ...
背景まず最初に、私はフロントエンド開発の専門家ではないことを述べておきたいと思います。私の以前のコン...
目次インストール構成よくある間違い事前テスト作業依存関係の扱いインスタンスとDOMを生成する要約する...
前回の記事では、openssl を使用して無料の証明書を生成した後、この証明書を使用してローカル ノ...
ハイパーリンクを使用すると、ページからページへ、またはサイトからサイトへ瞬時に移動できます。このよう...
1. ブラウザのレンダリングモードとdoctype一部の Web ページは標準に従って作成されていま...
CentOS8 に最小限のデプロイメントで OpenStack Ussuri をインストールするため...
インターネット上には、expect を使用して自動ログインを実現するスクリプトが多数存在しますが、明...