Linux-Anwendungsüberwachungstool

530
alexanoid

Ich habe eine Java-Anwendung (Fat Jar), ​​die auf der Linux-Ubuntu-Instanz ausgeführt wird und von Zeit zu Zeit fehlschlägt. Die Anwendung verfügt über einen eingebetteten Webserver und macht die URL für die Statusprüfung verfügbar.

Ich muss eine Art externe Überwachung über ein auf dieser Linux-Box installiertes Tool implementieren, das diese URL regelmäßig pingt und die Java-Anwendung bei Bedarf neu startet.

Könnten Sie mir bitte zeigen, wie es umgesetzt werden kann?

0
Was bewirkt die Health Check-URL? Wenn die Java-Anwendung neu gestartet werden muss, bedeutet dies, dass der eingebettete Webserver nicht funktioniert oder nicht reagiert? Ich meine, sind Sie sicher, dass das Pingen der URL ausreichend ist? Fanatique vor 6 Jahren 2
Danke für deine Antwort. Die URL für die Zustandsüberprüfung gibt im Normalfall den HTTP-Statuscode 200OK zurück. Ja, bei anderen Antworten oder gar keiner Antwort über diese URL - wir sollten die Java-Anwendung neu starten. Es ist auch schön, die Gesundheitsprüfung mit ein paar Wiederholungen durchzuführen und auch die Prozesse (wie zum Beispiel "ps aux | grep ...") zu überprüfen und die Prozesse dieser Anwendung zu beenden, falls vorhanden. alexanoid vor 6 Jahren 1
Die Frage nach einer Produkt- (Werkzeug) -Empfehlung ist hier bei Super User nicht Thema; nach einem Weg zu fragen, ist etwas in Ordnung. In Ihrem Kommentar stellen Sie einige Anforderungen vor. Sollten wir ein Skript für Sie schreiben? Wir sind kein Skript-Schreibservice, aber wir können Ihnen mit Ihrem Skript helfen, falls Sie nicht weiterkommen. Also was haben Sie * versucht? und wo genau steckst du fest? Außerdem: wie startet man die Anwendung? können Sie es zu einem systemd-Dienst machen? Wenn es fehlschlägt, wird es beendet? oder der Prozess existiert noch, aber er reagiert (etwas) nicht? Kamil Maciorowski vor 6 Jahren 3
Ich denke, ich kann es bei Bedarf als `systemd`-Dienst machen. Ich frage auch nach der Richtung, wie eine solche Aufgabe richtig umgesetzt wird. Ich kenne mich mit Linux nicht sehr gut aus und deshalb habe ich hier nach Ideen zur Implementierung gefragt. alexanoid vor 6 Jahren 0
Schreiben Sie ein Skript, um den Server zu überprüfen und erneut zu starten, und legen Sie fest, dass er regelmäßig von cron ausgeführt wird. Sie können wget und ein Timeout verwenden, um zu überprüfen, ob der Port geöffnet ist. davidgo vor 6 Jahren 0

1 Antwort auf die Frage

1
Fanatique

Ich bezweifle, dass Sie ein einziges Werkzeug finden würden, das all dies tun wird.

Es gibt jedoch eine Reihe von Maßnahmen, die Sie ausführen können, um das zu implementieren, was Sie möchten. Die Idee ist, dass Sie Ihre Java-App zu einem systemd-Dienst machen, ein Tool installieren müssen, das die URL für die Integritätsprüfung anpingt, und ein einfaches Bash-Skript verwenden, um gelegentlich auszuführen, dass das Tool ausgeführt wird, den Exit-Code überprüft und ob es ist Nicht das, wonach wir suchen, es wird Ihren Dienst neu starten (systemd kümmert sich um alle untergeordneten Prozesse usw.).

Machen Sie aus Ihrer Java-Anwendung einen systemd-Dienst:
Erstellen Sie eine Datei /etc/systemd/system/<my-service>.service. Ersetzen <my-service>Sie den Namen, den Sie für Ihren Dienst haben möchten.
Bearbeiten Sie Ihre Datei, indem Sie Folgendes konfigurieren:

[Unit] Description=My java application After=network.target  [Service] Type=simple ExecStart=/usr/bin/java -jar /path/to/my/jar # or whatever command you use to start your application, make sure the paths are absolute (to find your java executable, run `whereis java`) User=someuser # the user with which the application will run, can be root StandardOutput=journal StandardError=journal # you can configure where stdout/stderr go, you can use journal for easier logging  [Install] WantedBy=multi-user.target 

Sie müssen Folgendes bearbeiten:
Beschreibung - Legen Sie eine Beschreibung fest, die für Ihre Anwendung geeignet ist (nicht erforderlich).
Typ - Wenn Ihre Anwendung unterordnete und untergeordnete Prozesse ausführt, müssen Sie den Typ auf setzen forking, sodass systemd weiß, dass Sie untergeordnete Prozesse verzweigen wird sie auch verwalten.
ExecStart - der Befehl (mit absoluten Pfaden), den Sie zum Starten Ihrer Anwendung verwenden. Sie können es auch zu einem Bash-Skript machen.

Nachdem Sie diese Datei konfiguriert haben, müssen Sie die Daemon-Konfigurationen für systemd neu laden:
sudo systemctl daemon-reload

Aktivieren Sie dann Ihren Dienst (wenn Sie möchten, dass er beim Booten automatisch gestartet wird):
sudo systemctl enable <my-service>.service
oder starten Sie ihn einfach:
sudo systemctl start <my-service>.service

Herzlichen Glückwunsch, jetzt arbeitet Ihre Anwendung als systemd-Dienst. Ausführlichere Informationen zum Erstellen, Ändern und Verwalten benutzerdefinierter systemd-Dienste finden Sie in dieser Red Hat-Dokumentation .

Der nächste Schritt ist jedoch noch nicht abgeschlossen:
Installieren Sie das erforderliche Tool zum Ping Ihrer URL und erstellen Sie ein Bash-Skript, um den Dienst neu zu starten:
Ein Tool, mit dem Sie Ping-URLs verwenden können, ist httpingbeispielsweise. Sie können es auf Ihrem Ubuntu-System installieren, indem Sie es ausführen sudo apt install httping.
Dann schreiben Sie ein Bash-Skript, das httpingmit den richtigen Argumenten aufruft, und starten Sie den Dienst neu, falls etwas schief geht. Etwas wie das folgende (ein sehr einfaches Beispiel):

#!/bin/bash  httping -c 5 -g <url_for_health_check> -s  if [[ $? -eq 0 ]]; then echo "Health check is OK." else echo "Health check is not OK.. restarting service." sudo systemctl restart <my_service>.service fi 

Dieses Bash-Skript ruft httpingdie Health Check-URL fünfmal auf und ruft sie für ihren Statuscode ( -cfür die Anzahl der Pings, -gfür die URL, -sfür den Statuscode) fünfmal ab . Wenn httpingmit aufgerufen wird -s, wird es niemals mit einem Beendigungscode von beendet, es 0sei denn, der Status der URL ist OK. Wenn er also nicht beendet wird 0, gibt es ein Problem. Wir starten den Dienst neu (das ist die if-Prüfung).

Also sind wir fertig? Wir haben jetzt ein Skript, das unseren Dienst (Java-Anwendung) neu startet, falls Probleme auftreten. Dieses Skript muss jedoch im Laufe der Zeit immer noch automatisch ausgeführt werden.

Dazu können Sie entweder einen Cron-Job erstellen oder einen Systemd-Timer verwenden .

Ein Beispiel, wie Sie dies mit systemd tun können:
Zuerst müssen Sie Ihr bash-Skript zu einem Dienst machen, genau wie Ihre Java-Anwendung. Diesmal jedoch viel einfacher.

Erstellen Sie die Datei /etc/systemd/system/health_check.serviceund fügen Sie Folgendes hinzu (Pfad natürlich ändern):

[Unit] Description=Health check bash script  [Service] Type=oneshot ExecStart=/bin/bash /path/to/bash/script.sh 

Dann erstellen Sie einen Systemd-Timer, um diesen Dienst auszuführen:
Erstellen Sie ihn /etc/systemd/system/health_check.timerund füllen Sie ihn mit folgendem Inhalt:

[Unit] Description=Health check script timer After=<my_service>.service  [Service] Unit=health_check.service OnCalendar=minutely  [Install] WantedBy=multi-user.target 

Hier müssen Sie angeben, dass der Timer immer nach dem überwachten Dienst gestartet werden muss (durch <my_service>.serviceden Java-Anwendungsdienst ersetzen ). Und OnCalendar=gibt an, wann der Timer ausgeführt werden soll. Derzeit läuft es einmal pro Minute. Sie können das ändern, systemd.timefür mehr Details.

Aaand das ist es fast. Nun aktivieren Sie einfach den Timer (nicht den Bash-Script-Dienst) und starten ihn, laden Sie jedoch zunächst die Daemon-Konfigurationen erneut:

sudo systemctl daemon-reload  sudo systemctl enable health_check.timer sudo systemctl start health_check.timer 

Jetzt solltest du bereit sein. Alle 1 Minute startet ein Timer Ihr Bash-Skript. Dabei wird geprüft, ob die URL für die Integritätsprüfung in Ordnung ist. Wenn dies nicht der Fall ist, wird der Dienst neu gestartet.

Es gibt etwas komplexere Möglichkeiten, dies ohne die Verwendung von Bash-Skripten zu tun, nur systemd, aber für Anfänger sollte dies funktionieren.

Hinweis: Dadurch wird eine vollständig automatische Überwachung eingerichtet. Manuelle Eingriffe sind nicht erforderlich, deshalb aktivieren Sie auch den Timer, damit er zusammen mit Ihrer Java-Anwendung beim Start ausgeführt werden kann. Wenn Sie alles manuell ausführen möchten, aktivieren Sie diese Dienste nicht und starten Sie sie nur dann, wenn Sie dies tun müssen.

Referenzen:
systemd.service - Die Handbuchseite für systemd-Serviceeinheiten. Sie können lesen, was Services sind, wie sie verwendet werden und wie sie konfiguriert werden.
systemd.timer - die Handbuchseite für systemd Timer-Einheiten, um zu verstehen, wie Timer funktionieren und wie man sie konfiguriert.