Ich spiele in letzter Zeit mit Big Data. Ein Freund kam zu mir und sagte, dass sein Online-Kater sich unerklärlicherweise von seinem Account getrennt habe. Er war sehr verzweifelt und bat mich um Hilfe. Jedes Mal, wenn er abgemeldet war, meldete er sich über die Webkonsole von Tencent Cloud an und startete Tomcat. Im Geiste, anderen zu helfen (shao kao hao chi), habe ich Verbindungen hergestellt und mit der Analyse begonnen. Überprüfen Sie zunächst das Tomcat-Protokoll, um zu sehen, ob relevante Informationen aufgezeichnet wurden und wie diese ausgelesen wurden. Aus dem Protokoll ist ersichtlich, dass Tomcat die Beendigungsanforderung erhalten und den Container wie erforderlich geschlossen hat. Können wir also davon ausgehen, dass jemand shutdown.sh ausgeführt hat? NEIN. Das Shutdown-Protokoll nach der Ausführung des Shutdown-Skripts sieht wie folgt aus. Die zugehörigen Screenshots des Tomcat-Quellcodes sind wie folgt. Auf der linken Seite des Screenshots befinden sich Zeilennummern. Wenn Tomcat startet, legen Sie „await“ fest, um auf die Eingabe der Anweisung zum Herunterfahren zu warten. org\apache\catalina\startup\Bootstrap.java Die Definition von catalinaDaemon ist wie folgt. org\apache\catalina\startup\Catalina.java Beim Instanziieren wird die Instanz der Schnittstelle Server auf StandardServer verwiesen. Der Klassenpfad ist wie folgt. org\apache\catalina\Server.java org\apache\catalina\core\StandardServer.java Der Quellcode der Ausgabe-bezogenen Protokolle in StandServer lautet wie folgt: Die gelesene Konfigurationsdatei ist org\apache\catalina\core\LocalStrings.properties Wenn Tomcat einen ordnungsgemäßen Herunterfahrbefehl erhält, wird dieses Protokoll ausgegeben, das angibt, dass ein Befehl zum Herunterfahren des Containers empfangen wurde. Die richtigen Anweisungen zum Schließen des Containers, der entsprechende Code, lauten wie folgt. Die aktuellen Erkenntnisse zeigen also, dass dieser Tomcat nicht durch die SHUTDOWN-Meldung heruntergefahren wird. Darüber hinaus zeigt die folgende Abbildung auch, dass es nicht so einfach ist, den Befehl SHUTDOWN erfolgreich auszugeben. Der wahrscheinlichste Weg besteht derzeit darin, über den KILL-Befehl vorzugehen. Zum Ausführen eines Bash-Skripts ist eine Anmeldung am Computer erforderlich. Wie wäre es also, nach den aktuellen Anmeldedatensätzen von wtmp und utmp zu suchen? Nachfolgend finden Sie die Ergebnisse von IPIP. Mit anderen Worten: Als Tomcat am Morgen des 23. ungewöhnlicherweise beendet wurde, trennte zufällig auch eine Adresse aus dem BGP-Rechenzentrum von Tencent Cloud die Sitzung. Die Maschine meines Freundes befindet sich in der Tencent Cloud. Ein bisschen seltsam, nicht wahr? Ich habe meine Untersuchungen fortgesetzt, die Tomcat-Protokolle mehrere Tage hintereinander zurückverfolgt, die UTMP- und WTMP-Ergebnisse verglichen und dann die IPIP-Ergebnisse verglichen, und die Ergebnisse waren alle gleich. Die Sitzung vom Tencent Cloud BGP-Rechenzentrum wird getrennt und Tomcat wird gleichzeitig beendet. Auf die Sekunde genau. Dies geschieht viele Male an vielen aufeinanderfolgenden Tagen und weist darauf hin, dass ein kausaler Zusammenhang zwischen dem Beenden des Tomcat und dem Beenden der WEB-Sitzung besteht. Auf Nachfrage bestätigte mein Freund, dass er es gewohnt sei, sich über die WEB-Konsole beim Server anzumelden. Nachdem er Tomcat gestartet hatte, legte er es beiseite und begann mit dem Debuggen der Schnittstelle. Was könnte also die Ursache für einen solchen Kausalzusammenhang sein? Dies bringt uns zum seit langem bestehenden Interprozess-Kommunikationsmechanismus des Linux-Systems – dem Semaphor. Spezifische Informationen zu Semaphoren finden Sie in den entsprechenden Materialien. Für dieses Problem kann es einfach als ein Mechanismus zur Kommunikation zwischen Prozessen verstanden werden. Prozess A benötigt Prozess B, um etwas zu tun, aber die Speicherbereiche zwischen den Prozessen sind in gewissem Sinne füreinander unsichtbar. Zu diesem Zeitpunkt muss es durch ein Semaphor abgeschlossen werden. Prozess A kann gemäß der vordefinierten Semaphorspezifikation ein Semaphor an Prozess B senden. Wenn Prozess B es empfängt, bestimmt er die Verarbeitungslogik basierend auf dem spezifischen Wert des Semaphors. Die spezifische Semaphorenliste kann über den folgenden Befehl in der Befehlszeile abgefragt werden. Die Befehle bestehen alle aus Buchstaben, ohne die Zahl 1. Die häufigste ist 9, SIGKILL. Wenn ein Prozess dieses Semaphor empfängt, wird er beendet. Dieses Semaphor wird vom Betriebssystem gehandhabt und kann nicht von Anwendungen gehandhabt werden. In Windows-Systemen vor Vista gab es eine Möglichkeit, in den Kernel einzudringen. Zu diesem Zeitpunkt können Sie Nachrichten wie WM_CLOSE abfangen, um das Schließen eines Programms zu verhindern. Im Zeitalter von Win7 und Win10 können solche Techniken nicht mehr verwendet werden. Darüber hinaus sendet die bekannte Operation STRG + C SIGINT. In manchen Fällen müssen wir das Programm benachrichtigen, damit es ordnungsgemäß beendet wird. In diesem Fall können wir SIGQUIT ausgeben, also kill -3. Welches Signal wird also ausgegeben, wenn die WEB-Konsolensitzung getrennt wird? Lassen Sie es uns versuchen und herausfinden. Obwohl Java das zugrunde liegende System nicht betreiben kann, hält das Paket sun.misc einige Überraschungen bereit. Der Code lautet wie folgt. Wie in der Abbildung gezeigt, gibt dieser Code den Thread-Namen und den Semaphor-Namen aus und übersetzt ihn beim Empfang eines Semaphors in eine bestimmte Nummer. Dann habe ich in der Hauptfunktion vier Semaphoren „registriert“: HUP, INT, ABRT und TERM. Ich habe vier Typen registriert, weil ich nicht sicher war, was herauskommen würde, also habe ich einfach alle möglichen registriert. Kompilieren und verpacken. Hier gibt es ein Problem, das beachtet werden muss. Da Semaphoren zum zugrunde liegenden Mechanismus des Betriebssystems gehören, sind die von den verschiedenen Betriebssystemen unterstützten Semaphoren unterschiedlich. Die JVM bietet Unterstützung durch private static native int findSignal(String paramString). Die native Methode erfordert eine spezifische VM-Implementierung, daher werde ich den Code nicht veröffentlichen. Man könnte jedoch leicht annehmen, dass Windows und Linux sich unterscheiden. Hier müssen wir also auf dem oberen Computer schreiben und auf dem unteren Computer debuggen. Keine Panik, wenn beim Ausführen unter Windows eine Fehlermeldung erscheint. Der Rest ist einfach. Laden Sie das Programm auf den Server hoch, melden Sie sich über die WEB-Konsole beim Server an, leiten Sie die Ausführungsergebnisse in eine Textdatei um und warten Sie dann, bis die Konsole eine Zeitüberschreitung aufweist. Die Ergebnisse sind wie folgt. Es ist nicht erforderlich, die Ergebnisse zu analysieren. Die WEB-Konsole gibt beim Beenden ein SIGHUP aus, was kill -1 entspricht. Was macht Tomcat, wenn er SIGHUP empfängt? Sie können versuchen, -1 pid zu beenden und sich dann zum Verständnis das Protokoll anzusehen. Die Lösung ist eigentlich einfach. SIGHUP bedeutet HANG UP. Sie können nohup xx.sh & verwenden, um SIGHUP und SIGINT vollständig zu blockieren. Darüber hinaus wurde nach dem Testen festgestellt, dass das Semaphor auch durch Klicken auf das × auf der rechten Seite der SecureCRT-Registerkarte ausgelöst werden kann, es jedoch nicht durch direktes Abmelden oder Klicken auf das rote Kreuz im Menü ausgelöst wird. Interessierte Freunde können dieses Programm erweitern und testen. Möglicherweise lässt sich Ihr Problem mit dem abnormalen Ausgang lösen. Die Lösung dieses Problems ist untrennbar mit Liu Jiangang von Shanghai ZTO verbunden und ihm gilt unser besonderer Dank. Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: Bringen Sie Ihnen bei, wie Sie wartbaren JS-Code schreiben
>>: Sollte ich JQuery aufgeben?
Inhaltsverzeichnis Der Ursprung von JSBridge Das ...
In diesem Artikelbeispiel wird der spezifische Ja...
Dieser Artikel beschreibt anhand eines Beispiels ...
Inhaltsverzeichnis 1. Nutzung 1. Grundlegende Ver...
Das Docker-Paket ist bereits im Standard-Reposito...
Schritt 1: Überprüfen Sie die lokalen Ethernet-Ei...
Laden Sie MySQL herunter https://dev.mysql.com/do...
Ich bin heute auf ein sehr seltsames Problem gesto...
Inhaltsverzeichnis Einführung Vier Merkmale von T...
Vorwort Kürzlich stieß ich bei der Arbeit auf ein...
Xiaobai lernte Vue kennen, dann lernte er Webpack...
In tatsächlichen Projekten gibt es Beziehungen zw...
Senden von E-Mails mit der Mail-Funktion von PHP ...
Technischer Hintergrund Latex ist ein unverzichtb...
Inhaltsverzeichnis 1. Grundlagen der Audiowiederg...