Comment configurer joliment l'application Spring Boot empaquetée sous forme de pot exécutable en tant que service dans un système Linux? Est-ce l'approche recommandée, ou devrais-je convertir cette application en guerre et l'installer dans Tomcat?
Actuellement, je peux exécuter l'application de démarrage Spring à partir de la screen
session, ce qui est bien, mais nécessite un démarrage manuel après le redémarrage du serveur.
Ce que je suis à la recherche est des conseils généraux / direction ou un échantillon de init.d
script, si mon approche avec exécutable pot est propre.
service
startup
init.d
spring-boot
MariuszS
la source
la source
Réponses:
Les travaux suivants pour Springboot 1.3 et supérieur:
En tant que service init.d
Le fichier exécutable contient les commandes habituelles de démarrage, d'arrêt, de redémarrage et d'état. Il configurera également un fichier PID dans le répertoire habituel / var / run et se connectera par défaut dans le répertoire habituel / var / log.
Il vous suffit de créer un lien symbolique entre votre pot et /etc/init.d comme ceci
OU
Après cela, vous pouvez faire l'habituel
Ensuite, configurez un lien dans le niveau d'exécution dans lequel vous souhaitez que l'application démarre / s'arrête au démarrage si vous le souhaitez.
En tant que service systemd
Pour exécuter une application Spring Boot installée dans var / myapp, vous pouvez ajouter le script suivant dans /etc/systemd/system/myapp.service:
NB: dans le cas où vous utilisez cette méthode, n'oubliez pas de rendre le fichier jar lui-même exécutable (avec chmod + x) sinon il échouera avec l'erreur "Autorisation refusée".
Référence
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
la source
<executable>true</executable>
à monpom.xml
, mais le fichier JAR empaqueté ne s'exécute pas (...../myapp.jar ... cannot execute binary file
)-Dspring.profiles.active=prod
ces services? Question - stackoverflow.com/questions/31242291/…/etc/init.d stop
n'arrête pas l'application, elle essaie de la redémarrer.Ce qui suit est le moyen le plus simple d'installer une application Java en tant que service système sous Linux.
Supposons que vous utilisez
systemd
(ce que fait n'importe quelle distribution moderne de nos jours):Tout d'abord, créez un fichier de service dans
/etc/systemd/system
nommé par exemplejavaservice.service
avec ce contenu:Deuxièmement, notifiez
systemd
le nouveau fichier de service:et l'activer, donc il s'exécute au démarrage:
Finalement, vous pouvez utiliser les commandes suivantes pour démarrer / arrêter votre nouveau service:
À condition que vous l'utilisiez
systemd
, c'est la manière la plus simple et la moins intrusive de configurer une application Java en tant que service système.Ce que j'aime particulièrement dans cette solution, c'est que vous n'avez pas besoin d'installer et de configurer d'autres logiciels. L'expéditeur
systemd
fait tout le travail pour vous et votre service se comporte comme n'importe quel autre service système. Je l'utilise en production depuis un moment maintenant, sur différentes distributions, et cela fonctionne comme vous vous en doutez.Un autre avantage est que, en utilisant
/usr/bin/java
, vous pouvez facilement ajouter desjvm
paramètres tels que-Xmx256m
.Lisez également la
systemd
partie dans la documentation officielle de Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.htmlla source
[Unit]
section, par exempleAfter=mysql.service
,Before=apache2.service
.Vous pouvez également utiliser supervisord qui est un démon très pratique, qui peut être utilisé pour contrôler facilement les services. Ces services sont définis par de simples fichiers de configuration définissant ce qu'il faut exécuter avec quel utilisateur dans quel répertoire et ainsi de suite, il existe une multitude d'options. supervisord a une syntaxe très simple, c'est donc une très bonne alternative à l'écriture de scripts d'initialisation SysV.
Voici simple supervisord fichier de configuration pour le programme que vous essayez d'exécuter / contrôle. (mettez-le dans /etc/supervisor/conf.d/yourapp.conf )
/etc/supervisor/conf.d/yourapp.conf
Pour contrôler l'application, vous devez exécuter supervisorctl , qui vous présentera une invite à partir de laquelle vous pourrez démarrer, arrêter et indiquer votre application.
CLI
Si la
supervisord
démon est déjà en cours d'exécution et que vous avez ajouté la configuration de votre service sans redémarrer le démon, vous pouvez simplement faire une commandereread
etupdate
dans lesupervisorctl
shell.Cela vous donne vraiment toutes les flexibilité que vous auriez avec les scripts SysV Init, mais faciles à utiliser et à contrôler. Jetez un œil à la documentation .
la source
systemd
qui est intégré dans la plupart des distributions Linux actuelles.Je viens de le faire moi-même, donc voici où je suis jusqu'à présent en termes de script de contrôleur de service CentOS init.d. Cela fonctionne très bien jusqu'à présent, mais je ne suis pas un hacker Let Bash, donc je suis sûr qu'il y a place à amélioration, donc les réflexions sur l'amélioration sont les bienvenues.
Tout d'abord, j'ai un court script de configuration
/data/svcmgmt/conf/my-spring-boot-api.sh
pour chaque service, qui définit les variables d'environnement.J'utilise CentOS, donc pour m'assurer que mes services sont démarrés après un redémarrage du serveur, j'ai un script de contrôle de service dans
/etc/init.d/my-spring-boot-api
:Comme vous pouvez le voir, cela appelle le script de configuration initial pour configurer les variables d'environnement, puis appelle un script partagé que j'utilise pour redémarrer tous mes services Spring Boot. Ce script partagé est l'endroit où la viande de tout cela peut être trouvée:
Lors de l'arrêt, il tentera d'utiliser Spring Boot Actuator pour effectuer un arrêt contrôlé. Cependant, dans le cas où Actuator n'est pas configuré ou ne s'arrête pas dans un délai raisonnable (je lui donne 5 secondes, ce qui est vraiment un peu court), le processus sera tué.
De plus, le script suppose que le processus java exécutant l'application sera le seul avec "my-spring-boot-api.jar" dans le texte des détails du processus. Ceci est une hypothèse sûre dans mon environnement et signifie que je n'ai pas besoin de garder une trace des PID.
la source
java -jar
. Le reste du script est toujours nécessaire.Si vous souhaitez utiliser Spring Boot 1.2.5 avec Spring Boot Maven Plugin 1.3.0.M2, voici la solution:
Compilez ensuite comme d'habitude:,
mvn clean package
créez un lien symboliqueln -s /.../myapp.jar /etc/init.d/myapp
, rendez-le exécutablechmod +x /etc/init.d/myapp
et démarrez-leservice myapp start
(avec Ubuntu Server)la source
1.3.0.M2
, mais j'ai eu une erreur lorsque j'ai essayé1.3.0.RC1
.springBoot { executable = true }
bloc.Je sais que c'est une question plus ancienne, mais je voulais présenter une autre manière qui est le plugin appassembler-maven . Voici la partie pertinente de mon POM qui comprend de nombreuses valeurs d'options supplémentaires que nous avons trouvées utiles:
la source
EN TANT QUE SERVICE WINDOWS
Si vous voulez que cela s'exécute dans la machine Windows, téléchargez le winsw.exe à partir de
Après cela, renommez-le en nom de fichier jar (par exemple: votre-app .jar)
Créez maintenant un fichier xml your-app.xml et copiez le contenu suivant dans celui-ci
Assurez-vous que l' exe et le xml avec le pot dans un même dossier.
Après cette invite de commande ouverte dans le privilège Administrateur et installez-la sur le service Windows.
En cas d'échec avec
Essayez ensuite ce qui suit:
c'est tout :) .
Pour désinstaller le service dans Windows
Pour voir / exécuter / arrêter le service: win + r et tapez Outils d'administration, puis sélectionnez le service à partir de cela. Cliquez ensuite avec le bouton droit de la souris sur l' option - exécuter / arrêter
la source
Mon script SysVInit pour Centos 6 / RHEL (pas encore idéal). Ce script nécessite ApplicationPidListener .
Source de
/etc/init.d/app
Exemple de fichier de configuration
/etc/sysconfig/app
:la source
Voici un script qui déploie un pot exécutable en tant que service systemd.
Il crée un utilisateur pour le service et le fichier .service, place le fichier jar sous / var et effectue un verrouillage de base des privilèges.
Exemple:
la source
J'essaie de créer des applications Springboot qui sont présentées comme un script shell de style "init.d" avec une application Java compressée clouée à la fin
En associant ces scripts de /etc/init.d/spring-app à /opt/spring-app.jar et en chmodant le pot pour être exécutable, il est possible de faire démarrer "/etc/init.d/spring-app" "" /etc/init.d/spring-app stop "et d'autres possibilités comme le travail d'état
Vraisemblablement, comme les scripts de style init.d de springboot semblent avoir les cordes magiques nécessaires (comme
# Default-Start: 2 3 4 5
), chkconfig pourrait l'ajouter en tant que "service"Mais je voulais le faire fonctionner avec systemd
Pour que cela fonctionne, j'ai essayé de nombreuses recettes dans les autres réponses ci-dessus, mais aucune n'a fonctionné pour moi sur Centos 7.2 avec Springboot 1.3. La plupart du temps, elles allaient démarrer le service mais ne pouvaient pas suivre le pid
En fin de compte, j'ai trouvé que ce qui suit fonctionnait pour moi, lorsque le lien /etc/init.d était également en place. Un fichier similaire à celui ci-dessous doit être installé en tant que
/usr/lib/systemd/system/spring-app.service
la source
J'ai fini par faire le service systemd pour la mise en page WAR / JAR
J'appelle java -jar parce que c'est plus flexible. J'ai aussi essayé de mettre ExecStart = spring-mvc.war mais même s'il est exécutable, j'ai eu 'Erreur de format Exec'
Quoi qu'il en soit ces jours-ci, systemd est présent sur toutes les distributions et offre une bonne solution pour rediriger les journaux (syserr est important lorsque votre service ne démarre même pas l'emplacement du fichier log4j sera vide :)).
rsyslog - redirige l'entrée syslog de l'application vers un dossier / fichier spécifique
logrotate
logrotate gc
la source
Dans cette question, la réponse de @PbxMan devrait vous aider à démarrer:
Exécuter une application Java en tant que service sous Linux
Éditer:
Il existe une autre façon, moins agréable, de démarrer un processus au redémarrage, en utilisant cron:
Cela fonctionne, mais ne vous donne pas d'interface de démarrage / d'arrêt agréable pour votre application. Vous pouvez toujours le
kill
faire de toute façon ...la source
Je ne connais pas de façon standard de le faire avec une application Java, mais c'est certainement une bonne idée (vous voulez bénéficier des capacités de survie et de surveillance du système d'exploitation si elles sont là) . Il est sur la feuille de route pour fournir quelque chose à partir du support de l'outil Spring Boot (maven et gradle), mais pour le moment, vous devrez probablement lancer le vôtre. La meilleure solution que je connaisse actuellement est Foreman , qui a une approche déclarative et des commandes d'une ligne pour empaqueter les scripts init pour différents formats de système d'exploitation standard (monit, sys V, upstart, etc.). Il existe également des preuves de personnes ayant installé des trucs avec gradle (par exemple ici ).
la source
Utilisez-vous Maven? Ensuite, vous devriez essayer le plug-in AppAssembler:
Voir: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
la source
La configuration suivante est requise dans le fichier build.gradle des projets Spring Boot.
build.gradle
Cela est nécessaire pour créer un pot entièrement exécutable sur le système Unix (Centos et Ubuntu)
Créez un fichier .conf
Si vous souhaitez configurer des propriétés JVM personnalisées ou des arguments d'exécution d'application Spring Boot, vous pouvez créer un fichier .conf avec le même nom que le nom de l'application Spring Boot et le placer parallèlement au fichier jar.
Étant donné que your-app.jar est le nom de votre application Spring Boot, vous pouvez créer le fichier suivant.
Cette configuration définira 64 Mo de RAM pour l'application Spring Boot et activera le profil prod.
Créer un nouvel utilisateur sous Linux
Pour une sécurité renforcée, nous devons créer un utilisateur spécifique pour exécuter l'application Spring Boot en tant que service.
Créer un nouvel utilisateur
Sur Ubuntu / Debian, modifiez la commande ci-dessus comme suit:
Définir le mot de passe
Rendre Springboot propriétaire du fichier exécutable
Empêcher la modification du fichier jar
Cela configurera les autorisations de jar afin qu'il ne puisse pas être écrit et ne puisse être lu ou exécuté que par son propriétaire springboot.
Vous pouvez éventuellement rendre votre fichier jar immuable en utilisant la commande change attribute (chattr).
Des autorisations appropriées doivent également être définies pour le fichier .conf correspondant. .conf nécessite juste un accès en lecture (Octal 400) au lieu d'un accès en lecture + exécution (Octal 500)
Créer un service Systemd
/etc/systemd/system/your-app.service
Redémarrez automatiquement le processus s'il est tué par le système d'exploitation
Ajoutez les deux attributs ci-dessous (Redémarrer et RestartSec) pour redémarrer automatiquement le processus en cas d'échec.
/etc/systemd/system/your-app.service
La modification fera redémarrer l'application Spring Boot en cas d'échec avec un retard de 30 secondes. Si vous arrêtez le service à l'aide de la commande systemctl, le redémarrage n'aura pas lieu.
Planifier le service au démarrage du système
Pour signaler que l'application démarre automatiquement au démarrage du système, utilisez la commande suivante:
Activer l'application Spring Boot au démarrage du système
Démarrer un arrêt du service
systemctl peut être utilisé dans Ubuntu 16.04 LTS et 18.04 LTS pour démarrer et arrêter le processus.
Lancer le processus
Arrêtez le processus
Références
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
la source
Suite à l'excellente réponse de Chad, si vous obtenez une erreur "Erreur: impossible de trouver ou de charger la classe principale" - et que vous passez quelques heures à essayer de le dépanner, que ce soit en exécutant un script shell qui démarre votre application java ou en le démarrant depuis systemd lui-même - et vous savez que votre chemin de classe est correct à 100%, par exemple, l'exécution manuelle du script shell fonctionne aussi bien que l'exécution de ce que vous avez dans systemd execstart. Assurez-vous que que vous exécutez les choses en tant qu'utilisateur correct! Dans mon cas, j'avais essayé différents utilisateurs, après un certain temps de dépannage - j'ai finalement eu une intuition, mis root comme utilisateur - le tour est joué, l'application a démarré correctement. Après avoir déterminé qu'il s'agissait d'un mauvais problème utilisateur, j'ai
chown -R user:user
le dossier et les sous-dossiers et l'application s'exécutaient correctement en tant qu'utilisateur et groupe spécifiés, il n'était donc plus nécessaire de l'exécuter en tant que root (mauvaise sécurité).la source
Dans les fichiers d'unité systemd, vous pouvez définir le répertoire des variables d'environnement ou via un
EnvironmentFile
. Je proposerais de faire les choses de cette façon car cela semble être le moins de friction.Exemple de fichier d'unité
Configurez ensuite un fichier sous
/etc/sysconfig/hello-world
lequel figurent les noms en majuscules de vos variables Spring Boot. Par exemple, une variable appeléeserver.port
suivrait le formulaireSERVER_PORT
comme une variable d'environnement:Le mécanisme exploité ici est que les applications Spring Boot prennent la liste des propriétés, puis les traduisent, en mettant tout en majuscules et en remplaçant les points par des traits de soulignement. Une fois que l'application Spring Boot a suivi ce processus, elle recherche les variables d'environnement qui correspondent et utilise celles trouvées en conséquence.
Ceci est mis en évidence plus en détail dans ce SO Q&A intitulé: Comment définir une propriété Spring Boot avec un trait de soulignement dans son nom via les variables d'environnement?
Références
la source
Cela peut être fait en utilisant le service Systemd dans Ubuntu
Vous pouvez suivre ce lien pour une description plus élaborée et différentes façons de le faire. http://www.baeldung.com/spring-boot-app-as-a-service
la source
Créez un script avec le nom your-app.service (rest-app.service). Nous devons placer ce script dans le répertoire / etc / systemd / system. Voici l'exemple de contenu du script
Prochain:
Références
entrez la description du lien ici
la source