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 httping
beispielsweise. 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 httping
mit 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 httping
die Health Check-URL fünfmal auf und ruft sie für ihren Statuscode ( -c
für die Anzahl der Pings, -g
für die URL, -s
für den Statuscode) fünfmal ab . Wenn httping
mit aufgerufen wird -s
, wird es niemals mit einem Beendigungscode von beendet, es 0
sei 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.service
und 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.timer
und 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>.service
den 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.time
fü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.