最近はビッグデータで遊んでいます。友人が私のところに来て、オンラインの 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 をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
B-Tree インデックスに加えて、MySQL は次のインデックスも提供します。ハッシュインデックス...
ボタンは頻繁に使用されます。ここでは、イベント処理メソッドを整理し、実装方法が多数あることを発見しま...
HTML フォームは、さまざまな種類のユーザー入力を収集するために使用されます。次のコードは、HTM...
問題の説明今日、ページ スタイルを変更していたときに、子要素にmargin-top設定したのに、子要...
私がこれまで携わってきた多くのプロジェクトでは、基本的に避けられない悪循環がありました。それは、ホー...
目次Nginx は 2 つの socket.io サーバーをプロキシします。 socket.ioの動...
目次01 コンテナの本質とは何か? 02 Cgroupテクノロジーと名前空間テクノロジーの概要03 ...
VueとネイティブJavaScriptカプセル化に基づいて、プルダウンリフレッシュとプルアップロード...
1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...
背景社内に新しいサーバーが追加され、2Tのハードディスクがマウントされました。sshでログイン後、マ...
目次序文1. SCPの使用法2. sftpを使用する3. scp と sftp の違いは何ですか?ど...
説明するこのインターフェースを呼び出すときは、次の点に注意する必要があります。パブリック IP アド...
継承する1. 継承とは何か継承: まず、継承とは関係、つまりクラス間の関係です。JS にはクラスはあ...
この記事では主にvue-routerのmatchedをベースにしたbreadcrumb機能を紹介し、...
導入JavaScript はデフォルトでシングルスレッドであるため、コードは並列実行するための新しい...