Wie konfiguriere ich eine Spring Boot-Anwendung, die als ausführbares JAR als Service in einem Linux-System verpackt ist? Ist dies ein empfohlener Ansatz oder sollte ich diese App in War konvertieren und in Tomcat installieren?
Derzeit kann ich die Spring-Boot-Anwendung von der screen
Sitzung aus ausführen , was nett ist, erfordert jedoch einen manuellen Start nach dem Neustart des Servers.
Was ich suche, ist ein allgemeiner Rat / eine Anleitung oder ein Beispielskript init.d
, wenn mein Ansatz mit ausführbarem JAR richtig ist.
service
startup
init.d
spring-boot
MariuszS
quelle
quelle
Antworten:
Folgendes funktioniert für Springboot 1.3 und höher:
Als init.d Service
Das ausführbare JAR verfügt über die üblichen Befehle zum Starten, Stoppen, Neustarten und Status. Außerdem wird eine PID-Datei im üblichen Verzeichnis / var / run eingerichtet und standardmäßig im üblichen Verzeichnis / var / log angemeldet.
Sie müssen nur Ihr Glas wie folgt mit /etc/init.d verknüpfen
ODER
Danach können Sie das Übliche tun
Richten Sie dann einen Link ein, in welchem Runlevel die App beim Booten gestartet / gestoppt werden soll, falls dies gewünscht wird.
Als systemd Service
Um eine in var / myapp installierte Spring Boot-Anwendung auszuführen, können Sie das folgende Skript in /etc/systemd/system/myapp.service hinzufügen:
NB: Wenn Sie diese Methode verwenden, vergessen Sie nicht, die JAR-Datei selbst ausführbar zu machen (mit chmod + x), da sie sonst mit dem Fehler "Berechtigung verweigert" fehlschlägt.
Referenz
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
quelle
<executable>true</executable>
zu meiner hinzugefügtpom.xml
, aber die gepackte JAR-Datei wird nicht ausgeführt (...../myapp.jar ... cannot execute binary file
)-Dspring.profiles.active=prod
auf diese Dienste weitergibt? Frage - stackoverflow.com/questions/31242291/…/etc/init.d stop
stoppt die App nicht, sondern versucht sie erneut zu starten.Was folgt, ist der einfachste Weg, eine Java-Anwendung als Systemdienst unter Linux zu installieren.
Nehmen wir an, Sie verwenden
systemd
(was heutzutage jede moderne Distribution tut):Erstellen Sie zunächst eine Servicedatei mit dem
/etc/systemd/system
Namen zBjavaservice.service
mit folgendem Inhalt:Zweitens benachrichtigen Sie
systemd
über die neue Servicedatei:und aktivieren Sie es, damit es beim Booten ausgeführt wird:
Schließlich können Sie die folgenden Befehle verwenden, um Ihren neuen Dienst zu starten / zu stoppen:
Vorausgesetzt, Sie verwenden
systemd
, ist dies die unaufdringlichste und sauberste Methode, um eine Java-Anwendung als Systemdienst einzurichten.Was mir an dieser Lösung besonders gefällt, ist die Tatsache, dass Sie keine andere Software installieren und konfigurieren müssen. Der Versand
systemd
erledigt die ganze Arbeit für Sie und Ihr Service verhält sich wie jeder andere Systemdienst. Ich benutze es jetzt schon eine Weile in der Produktion, auf verschiedenen Distributionen, und es funktioniert einfach so, wie Sie es erwarten würden.Ein weiteres Plus ist, dass
/usr/bin/java
Sie mit einfachjvm
Parameter wie hinzufügen können-Xmx256m
.Lesen Sie auch den
systemd
Teil in der offiziellen Spring Boot-Dokumentation: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.htmlquelle
[Unit]
Abschnitt, zum BeispielAfter=mysql.service
,Before=apache2.service
.Sie können auch Supervisord verwenden , einen sehr praktischen Daemon, mit dem Sie Dienste einfach steuern können. Diese Dienste werden durch einfache Konfigurationsdateien definiert, die definieren, was mit welchem Benutzer in welchem Verzeichnis ausgeführt werden soll usw. Es gibt zig Optionen. Supervisord hat eine sehr einfache Syntax und ist daher eine sehr gute Alternative zum Schreiben von SysV-Init-Skripten.
Hier eine einfache Supervisord- Konfigurationsdatei für das Programm, das Sie ausführen / steuern möchten. ( Geben Sie dies in /etc/supervisor/conf.d/yourapp.conf ein. )
/etc/supervisor/conf.d/yourapp.conf
Um die Anwendung zu steuern, müssten Sie Supervisorctl ausführen . Daraufhin wird eine Eingabeaufforderung angezeigt, in der Sie Ihre App starten, stoppen und den Status festlegen können.
CLI
Wenn der
supervisord
Dämon bereits ausgeführt wird und Sie die Konfiguration für Ihre Dienstleistung hinzugefügt haben, ohne den Dämon neu zu starten, können Sie einfach einen Befehlreread
undupdate
in dersupervisorctl
Shell ausführen .Dies gibt Ihnen wirklich alle Flexibilität, die Sie mit SysV Init-Skripten hätten, aber einfach zu verwenden und zu steuern. Schauen Sie sich die Dokumentation an .
quelle
systemd
in den meisten aktuellen Linux-Distributionen.Ich bin gerade erst dazu gekommen, dies selbst zu tun. Im Folgenden bin ich also in Bezug auf ein CentOS init.d Service Controller-Skript so weit. Bisher funktioniert es ganz gut, aber ich bin kein Bash-Hacker. Ich bin mir also sicher, dass es Raum für Verbesserungen gibt. Daher sind Überlegungen zur Verbesserung willkommen.
Zunächst habe ich
/data/svcmgmt/conf/my-spring-boot-api.sh
für jeden Dienst ein kurzes Konfigurationsskript , mit dem Umgebungsvariablen eingerichtet werden.Ich verwende CentOS. Um sicherzustellen, dass meine Dienste nach einem Neustart des Servers gestartet werden, habe ich ein Dienststeuerungsskript in
/etc/init.d/my-spring-boot-api
:Wie Sie sehen, ruft dies das anfängliche Konfigurationsskript auf, um Umgebungsvariablen einzurichten, und ruft dann ein freigegebenes Skript auf, mit dem ich alle meine Spring Boot-Dienste neu starte. In diesem gemeinsamen Skript finden Sie das Fleisch von allem:
Beim Anhalten wird versucht, mit Spring Boot Actuator ein kontrolliertes Herunterfahren durchzuführen. Falls Actuator jedoch nicht konfiguriert ist oder nicht innerhalb eines angemessenen Zeitrahmens heruntergefahren werden kann (ich gebe ihm 5 Sekunden, was wirklich ein bisschen kurz ist), wird der Prozess abgebrochen.
Außerdem geht das Skript davon aus, dass der Java-Prozess, auf dem die Anwendung ausgeführt wird, der einzige mit "my-spring-boot-api.jar" im Text der Prozessdetails ist. Dies ist eine sichere Annahme in meiner Umgebung und bedeutet, dass ich die PIDs nicht verfolgen muss.
quelle
java -jar
. Der Rest des Skripts wird noch benötigt.Wenn Sie Spring Boot 1.2.5 mit dem Spring Boot Maven Plugin 1.3.0.M2 verwenden möchten, finden Sie hier eine Lösung:
Dann als üblich kompilieren :
mvn clean package
, einen Symlink erstellenln -s /.../myapp.jar /etc/init.d/myapp
, ausführbar machenchmod +x /etc/init.d/myapp
und startenservice myapp start
(mit Ubuntu Server)quelle
1.3.0.M2
, aber ich habe einen Fehler erhalten, als ich es versuchte1.3.0.RC1
.springBoot { executable = true }
Block.Ich weiß, dass dies eine ältere Frage ist, aber ich wollte noch einen anderen Weg vorstellen, nämlich das Appassembler-Maven-Plugin . Hier ist der relevante Teil aus meinem POM, der viele zusätzliche Optionswerte enthält, die wir als nützlich erachtet haben:
quelle
ALS FENSTER-SERVICE
Wenn Sie möchten, dass dies auf einem Windows-Computer ausgeführt wird, laden Sie die Datei www.exe von herunter
Danach benennen Sie es in jar Dateiname um (zB: your-app .jar)
Erstellen Sie nun eine XML-Datei your-app.xml und kopieren Sie den folgenden Inhalt in diese
Stellen Sie sicher, dass sich exe und xml zusammen mit jar in demselben Ordner befinden.
Öffnen Sie nach dieser Eingabeaufforderung die Administratorrechte und installieren Sie sie auf dem Windows-Dienst.
Wenn es mit fehlschlägt
Versuchen Sie dann Folgendes:
das ist es :) .
So deinstallieren Sie den Dienst in Windows
Zum Anzeigen / Ausführen / Stoppen des Dienstes: win + r und geben Sie Verwaltung ein. Wählen Sie dann den Dienst aus. Klicken Sie dann mit der rechten Maustaste und wählen Sie die Option - Ausführen / Stoppen
quelle
Mein SysVInit-Skript für Centos 6 / RHEL (noch nicht ideal). Dieses Skript erfordert ApplicationPidListener .
Quelle von
/etc/init.d/app
Beispielkonfigurationsdatei
/etc/sysconfig/app
:quelle
Hier ist ein Skript, das eine ausführbare JAR-Datei als systemd-Dienst bereitstellt.
Es erstellt einen Benutzer für den Dienst und die .service-Datei, platziert die JAR-Datei unter / var und sperrt die Berechtigungen grundlegend.
Beispiel:
quelle
Ich versuche, Springboot-Anwendungen zu erstellen, die als Shell-Skript im "init.d" -Stil mit einer komprimierten Java-Anwendung am Ende dargestellt werden
Durch die Verknüpfung dieser Skripte von /etc/init.d/spring-app mit /opt/spring-app.jar und die Änderung der ausführbaren JAR-Datei kann "/etc/init.d/spring-app" gestartet werden "" /etc/init.d/spring-app stop "und andere Möglichkeiten wie Statusarbeit
Vermutlich, da die Skripte im init.d-Stil von springboot so aussehen, als hätten sie die erforderlichen magischen Zeichenfolgen (wie
# Default-Start: 2 3 4 5
), könnte chkconfig sie als "Dienst" hinzufügen.Aber ich wollte, dass es mit systemd funktioniert
Damit dies funktioniert, habe ich viele der Rezepte in den anderen Antworten oben ausprobiert, aber keines davon funktionierte für mich unter Centos 7.2 mit Springboot 1.3. Meistens starteten sie den Dienst, konnten aber die PID nicht verfolgen
Am Ende stellte ich fest, dass Folgendes für mich funktioniert hat, als der Link /etc/init.d ebenfalls vorhanden war. Eine Datei ähnlich der folgenden sollte als installiert werden
/usr/lib/systemd/system/spring-app.service
quelle
Am Ende habe ich systemd service für das WAR / JAR-Layout ausgeführt
Ich rufe Java-Jar an, weil es flexibler ist. Ich habe auch versucht, ExecStart = spring-mvc.war zu setzen, aber obwohl es ausführbar ist, habe ich 'Exec-Formatfehler' erhalten.
Heutzutage ist systemd in allen Distributionen vorhanden und bietet eine gute Lösung zum Umleiten von Protokollen (syserr ist wichtig, wenn Ihr Dienst nicht einmal startet. Der Speicherort der log4j-Datei ist leer :)).
rsyslog - Leitet die Syslog-Eingabe von der App in einen bestimmten Ordner / eine bestimmte Datei um
logrotate
logrotate gc
quelle
In dieser Frage sollte die Antwort von @PbxMan Ihnen den Einstieg erleichtern:
Führen Sie eine Java-Anwendung als Dienst unter Linux aus
Bearbeiten:
Es gibt eine andere, weniger gute Möglichkeit, einen Prozess beim Neustart mit cron zu starten:
Dies funktioniert, bietet Ihnen jedoch keine schöne Start / Stopp-Oberfläche für Ihre Anwendung. Du kannst es trotzdem einfach
kill
machen ...quelle
Ich kenne keine "Standard" -Methode in Schrumpffolie, um dies mit einer Java-App zu tun, aber es ist definitiv eine gute Idee (Sie möchten von den Keep-Alive- und Überwachungsfunktionen des Betriebssystems profitieren, wenn diese vorhanden sind). . Es ist auf der Roadmap, etwas von der Unterstützung des Spring Boot-Tools (Maven und Gradle) bereitzustellen, aber für den Moment müssen Sie wahrscheinlich Ihre eigenen rollen. Die beste Lösung, die ich derzeit kenne, ist Foreman , das einen deklarativen Ansatz und einzeilige Befehle zum Packen von Init-Skripten für verschiedene Standard-Betriebssystemformate (monit, sys V, upstart usw.) hat. Es gibt auch Hinweise darauf, dass Leute Sachen mit Gradle eingerichtet haben (z . B. hier ).
quelle
Benutzt du Maven? Dann sollten Sie das AppAssembler Plugin ausprobieren:
Siehe: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
quelle
Die folgende Konfiguration ist in der Datei build.gradle in Spring Boot-Projekten erforderlich.
build.gradle
Dies ist erforderlich, um ein vollständig ausführbares JAR auf einem Unix-System (Centos und Ubuntu) zu erstellen.
Erstellen Sie eine .conf-Datei
Wenn Sie benutzerdefinierte JVM-Eigenschaften oder Ausführungsargumente für Spring Boot-Anwendungen konfigurieren möchten, können Sie eine .conf-Datei mit demselben Namen wie der Name der Spring Boot-Anwendung erstellen und parallel zur JAR-Datei platzieren.
Wenn Sie bedenken, dass your-app.jar der Name Ihrer Spring Boot-Anwendung ist, können Sie die folgende Datei erstellen.
Diese Konfiguration legt 64 MB RAM für die Spring Boot-Anwendung fest und aktiviert das Produktprofil.
Erstellen Sie einen neuen Benutzer unter Linux
Zur Erhöhung der Sicherheit müssen wir einen bestimmten Benutzer erstellen, um die Spring Boot-Anwendung als Dienst auszuführen.
Erstellen Sie einen neuen Benutzer
Ändern Sie unter Ubuntu / Debian den obigen Befehl wie folgt:
Passwort festlegen
Machen Sie Springboot zum Besitzer der ausführbaren Datei
Verhindern Sie die Änderung der JAR-Datei
Dadurch werden die Berechtigungen von jar so konfiguriert, dass es nicht geschrieben und nur von seinem Besitzer springboot gelesen oder ausgeführt werden kann.
Sie können Ihre JAR-Datei optional mit dem Befehl change attribute (chattr) als unveränderlich festlegen.
Entsprechende Berechtigungen sollten auch für die entsprechende .conf-Datei festgelegt werden. .conf erfordert nur Lesezugriff (Octal 400) anstelle von Lese- und Ausführungszugriff (Octal 500)
Erstellen Sie den Systemd-Dienst
/etc/systemd/system/your-app.service
Starten Sie den Prozess automatisch neu, wenn er vom Betriebssystem beendet wird
Fügen Sie die beiden folgenden Attribute (Restart und RestartSec) hinzu, um den Prozess bei einem Fehler automatisch neu zu starten.
/etc/systemd/system/your-app.service
Durch die Änderung wird die Spring Boot-Anwendung im Fehlerfall mit einer Verzögerung von 30 Sekunden neu gestartet. Wenn Sie den Dienst mit dem Befehl systemctl beenden, wird kein Neustart durchgeführt.
Planen Sie den Service beim Systemstart
Verwenden Sie den folgenden Befehl, um die Anwendung so zu kennzeichnen, dass sie beim Systemstart automatisch gestartet wird:
Aktivieren Sie die Spring Boot-Anwendung beim Systemstart
Starten Sie einen Stop the Service
systemctl kann in Ubuntu 16.04 LTS und 18.04 LTS verwendet werden, um den Prozess zu starten und zu stoppen.
Starten Sie den Prozess
Stoppen Sie den Prozess
Verweise
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
quelle
Folgen Sie der hervorragenden Antwort von Chad, wenn Sie die Fehlermeldung "Fehler: Hauptklasse konnte nicht gefunden oder geladen werden" erhalten - und Sie verbringen ein paar Stunden damit, Fehler zu beheben, unabhängig davon, ob Sie ein Shell-Skript ausführen, das Ihre Java-App startet oder es startet von systemd selbst - und Sie wissen, dass Ihr Klassenpfad zu 100% korrekt ist, z. B. funktioniert das manuelle Ausführen des Shell-Skripts ebenso wie das Ausführen dessen, was Sie in systemd execstart haben. Stellen Sie sicher, dass Sie die Dinge als der richtige Benutzer ausführen! In meinem Fall hatte ich nach einiger Zeit der Fehlerbehebung verschiedene Benutzer ausprobiert - ich hatte endlich eine Ahnung, legte root als Benutzer - voila, die App wurde korrekt gestartet. Nachdem ich festgestellt habe, dass es sich um ein falsches Benutzerproblem handelt, habe ich
chown -R user:user
Der Ordner und die Unterordner sowie die App wurden korrekt als der angegebene Benutzer und die angegebene Gruppe ausgeführt, sodass sie nicht mehr als Root ausgeführt werden müssen (schlechte Sicherheit).quelle
In systemd-Einheitendateien können Sie das Umgebungsvariablenverzeichnis oder über ein Verzeichnis festlegen
EnvironmentFile
. Ich würde vorschlagen, die Dinge so zu machen, da es die geringste Reibung zu sein scheint.Beispieleinheitendatei
Richten Sie dann eine Datei ein,
/etc/sysconfig/hello-world
die Großbuchstaben Ihrer Spring Boot-Variablen enthält. Beispielsweiseserver.port
würde eine aufgerufene Variable dem FormularSERVER_PORT
als Umgebungsvariable folgen :Der hier ausgenutzte Mechanismus besteht darin, dass Spring Boot-Anwendungen die Liste der Eigenschaften übernehmen und sie dann übersetzen, alles in Großbuchstaben schreiben und Punkte durch Unterstriche ersetzen. Sobald die Spring Boot-App diesen Prozess durchlaufen hat, sucht sie nach übereinstimmenden Umgebungsvariablen und verwendet alle gefundenen Variablen entsprechend.
Dies wird in dieser SO-Frage und Antwort mit dem Titel: Wie wird eine Spring Boot-Eigenschaft mit einem Unterstrich im Namen über Umgebungsvariablen ausführlicher hervorgehoben?
Verweise
quelle
Dies kann mit dem Systemd-Dienst in Ubuntu erfolgen
Sie können diesem Link folgen, um eine ausführlichere Beschreibung und verschiedene Möglichkeiten zu erhalten. http://www.baeldung.com/spring-boot-app-as-a-service
quelle
Erstellen Sie ein Skript mit dem Namen your-app.service (rest-app.service). Wir sollten dieses Skript im Verzeichnis / etc / systemd / system ablegen. Hier ist der Beispielinhalt des Skripts
Nächster:
Verweise
Geben Sie hier die Linkbeschreibung ein
quelle