Printemps de Démarrage de l'application en tant que Service
Comment configurer joliment Printemps de Démarrage de l'application emballés comme exécutable jar comme un Service système linux? Est cette approche recommandée, ou devrais-je convertir cette application à la guerre et à installer dans le serveur Tomcat?
Actuellement je peux courir Printemps application de démarrage de screen
session, ce qui est bien, mais nécessite manuel de démarrage après le redémarrage du serveur.
Ce que je cherche n'est que des conseils d'ordre général/direction ou de l'échantillon init.d
script, si mon approche avec l'exécutable pot est bon.
- Pour commencer, est-ce que votre distribution utilisation upstart ou systemd ?
- Check this out github.com/rburgst/spring-boot-initscript/blob/master/...
Vous devez vous connecter pour publier un commentaire.
Les ouvrages suivants pour springboot 1.3:
Comme init.d service
L'exécutable jar a l'habitude de démarrer, d'arrêter, de redémarrer, et l'état des commandes. Il sera également mis en place un fichier PID habituelles dans le /var/run répertoire et à l'exploitation forestière d'habitude répertoire /var/log par défaut.
Vous avez juste besoin d'un symlink votre pot dans /etc/init.d comme
OU
Après cela, vous pouvez faire l'habitude
Puis l'installation d'un lien dans n'importe quel niveau d'exécution que vous voulez l'application pour démarrer/arrêter sur démarrer, si vous le souhaitez.
Comme un service systemd
Pour exécuter un Ressort de Démarrage de l'application installée dans var/myapp vous pouvez ajouter le script suivant dans /etc/systemd/system/myapp.service:
Référence
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
<executable>true</executable>
à monpom.xml
, mais le package de fichier JAR ne pas exécuter (..../myapp.jar ... cannot execute binary file
.)-Dspring.profiles.active=prod
à ce service? Question - stackoverflow.com/questions/31242291/...service myapp {start|stop}
? Je ne pouvais pas le faire fonctionner de cette façon, et je reçois unFailed to stop spring.service: Unit spring.service not loaded
erreur./etc/init.d stop
n'est pas l'arrêt de l'application, ses en essayant de le démarrer à nouveau.sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp
dansubuntu
isRunning() { ps -p "$1" &> /dev/null }
donc mêmeps -p
commande ne peut pas trouver de processus id, il renvoie toujours 0 (succès). comme résultat de printemps de démarrage générés service ne supprime pas approprié .fichier pid et il est impossible de démarrer le service de nouveau par la suite. détecté sur ps version "procps de la version 3.2.8"/etc/init.d/yourApp status
vous n'avez pas analyser vous-mêmeCe qui suit est la façon la plus simple d'installer une application Java en tant que service système sous Linux.
Supposons que vous êtes à l'aide de
systemd
(qui de toute moderne distro ne nos jours):Tout d'abord, créez un fichier de service dans
/etc/systemd/system
nommé par exemplejavaservice.service
avec ce contenu:Deuxièmement, informer
systemd
du nouveau service du fichier:et de l'activer, de sorte qu'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 utilisiez
systemd
, c'est de la plupart des non-intrusive et propre façon de mettre en place une application Java en tant que système-service.Ce que j'aime en particulier à propos de cette solution est le fait que vous n'avez pas besoin d'installer et de configurer n'importe quel autre logiciel. Le expédiés
systemd
fait tout le travail pour vous, et de votre service se comporte comme n'importe quel autre système de service. Je l'utilise en production pour un certain temps maintenant, sur les différentes distributions, et il fonctionne exactement comme vous le souhaitez.Un autre avantage est que, en utilisant
/usr/bin/java
, vous pouvez facilement ajouterjvm
paramètres tels que-Xmx256m
.Également lire les
systemd
partie dans l'officiel du Printemps de Démarrage de la documentation:http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
/etc/default/$service.conf
SuccessExitStatus=143
signifie "Traiter l'état de sortie 143 (ce qui correspond à SIGTERM) comme une sortie normale statut de ce service"Vous pouvez également utiliser supervisord qui est très pratique démon, qui peut être utilisé pour contrôler facilement les services. Ces services sont définis par de simples fichiers de configuration de la définition de ce qui doit être exécuté avec lequel l'utilisateur dans l'annuaire et ainsi de suite, il y a un tas d'options. supervisord est très simple syntaxe, donc il fait une très bonne alternative à l'écriture de scripts d'initialisation SysV.
Ici une simple supervisord fichier de configuration pour le programme que vous essayez d'exécuter/de contrôle. (mettre en /etc/superviseur/conf.d/yourapp.conf)
/etc/superviseur/conf.d/yourapp.conf
Pour contrôler l'application, vous devrez exécuter supervisorctl, qui va vous présenter avec un message où vous pouvez démarrer, arrêter, le statut yourapp.
CLI
Si le
supervisord
démon est déjà en cours d'exécution et que vous avez ajoutés à la configuration de votre séjour sans avoir à redémarrer le démon vous pouvez simplement faire unreread
etupdate
commande dans lesupervisorctl
shell.- Ce vraiment vous fournit tous les flexibilites vous avez à l'aide de scripts d'Initialisation SysV, mais facile à utiliser et à contrôler. Jetez un oeil à la la documentation.
J'ai juste eu le temps de le faire moi-même, donc la suite est là où je suis à présent en termes de CentOS init.d contrôleur de service de script. Ça fonctionne assez bien jusqu'à présent, mais je ne suis pas leet Bash hacker, donc je suis sûr qu'il y a de la place pour de l'amélioration, de sorte que les pensées sur l'amélioration sont les bienvenues.
Tout d'abord, j'ai un court script config
/data/svcmgmt/conf/my-spring-boot-api.sh
pour chaque service, qui permet de définir des variables d'environnement.J'utilise CentOS, de façon à ce que mes services sont démarrés après un redémarrage du serveur, j'ai un service de script de contrôle dans
/etc/init.d/my-spring-boot-api
:Comme vous pouvez le voir, qui appelle la première config script pour définir des variables d'environnement et appelle ensuite partagé un script que j'utilise pour le redémarrage de tous mes Printemps de Démarrage des services. Qui a partagé le script est l'endroit où la viande de celui-ci peuvent tous être trouvés:
Lors de l'arrêt, il va tenter d'utiliser le Printemps de Démarrage de l'Actionneur pour effectuer un arrêt contrôlé. Toutefois, dans le cas de l'Actionneur n'est pas configuré ou ne parvient pas à arrêter, dans un délai raisonnable (je lui donne 5 secondes, ce qui est un peu court en fait), le processus sera tué.
Aussi, le script fait l'hypothèse que le processus java de l'exécution de l'appllication sera le seul avec "my-spring-boot-api.jar" dans le texte de l'détails du processus. C'est une hypothèse sûre dans mon environnement et les moyens que je n'ai pas besoin de garder une trace des Pid.
java -jar
. Le reste du script est toujours nécessaire.Si vous souhaitez utiliser le Printemps de Démarrage 1.2.5 avec Spring Boot Plugin Maven 1.3.0.M2, voici la solution:
Puis compilez comme ususal:
mvn clean package
, faire un lien symboliqueln -s /.../myapp.jar /etc/init.d/myapp
, le rendre exécutablechmod +x /etc/init.d/myapp
et commencer àservice myapp start
(avec Ubuntu Server)1.3.0.M2
, mais j'ai une erreur quand j'ai essayé1.3.0.RC1
.springBoot { executable = true }
bloc.Je sais que c'est une vieille question, mais je voulais présenter encore une autre façon qui est la appassembler-maven-plugin. Voici la partie pertinente de mon POM qui comprend beaucoup plus de valeurs d'option, nous avons trouvé utile:
Mon SysVInit script pour Centos 6 /RHEL (pas idéal encore). Ce script nécessite ApplicationPidListener.
Source de
/etc/init.d/app
Exemple de fichier de configuration
/etc/sysconfig/app
:Voici un script qui déploie un exécutable jar comme un service systemd.
Il crée un utilisateur pour le service et l' .service fichier et placez le fichier jar dans /var, et permet à certains de base verrouiller des privilèges.
Exemple:
Je suis en train de faire springboot les applications qui sont présentés comme un "init.d" style script shell avec un comprimé d'applications java cloué sur la fin
Par créer des liens symboliques vers ces scripts de /etc/init.d/printemps-app /opt/spring-app.jar et chmod avec le pot pour qu'il soit exécutable, il est possible de faire "/etc/init.d/printemps-app start" "/etc/init.d/printemps-app stop" et d'autres possibilités comme le statut de travail
Sans doute, comme l'init.d style de scripts à partir de springboot style qu'ils ont le nécessaire chaînes magiques ( comme
# Default-Start: 2 3 4 5
) chkconfig serait en mesure de l'ajouter comme un "service"Mais je voulais le faire fonctionner avec systemd
Pour faire ce travail, j'ai essayé beaucoup de recettes dans les autres réponses ci-dessus, mais n'a pas fonctionné pour moi sur Centos 7.2 avec Springboot 1.3 pour la Plupart, ils allaient commencer le service, mais ne pas être en mesure de suivre le pid
En fin de compte j'ai trouvé le suivant a fonctionné pour moi, lorsque le /etc/init.d-link a été en place également. Un fichier similaires à celle-ci doit être installé comme
/usr/lib/systemd/system/spring-app.service
EN TANT QUE SERVICE WINDOWS
Si vous le souhaitez exécuter en machine windows, télécharger le winsw.exe de
Après que le renommer en pot de nom de fichier (ex: votre application.jar)
Maintenant créer un fichier xml your-app.xml et de copier le contenu suivant que
Assurez-vous que le exe et xml avec pot dans un même dossier.
Après cette ouverture invite de commande en Administrateur previlege et l'installer sur le service windows.
Si elle ne parvient pas à
Essayez les solutions suivantes:
c'est tout 🙂 .
Pour désinstaller le service dans windows
Pour voir/exécuter/arrêter le service:
win+r et le type outils d'Administration puis sélectionnez le service de que. Puis clic droit choisir le option - run /stop
Dans cette question, la réponse de @PbxMan devrait vous obtenir a commencé:
Exécuter une Application Java en tant que Service sur Linux
Edit:
Il est un autre, moins belle façon de commencer un processus de redémarrage, à l'aide de cron:
Cela fonctionne, mais vous donne pas de belles start/stop pour votre application. Vous pouvez toujours simplement
kill
de toute façon...Je ne sais pas d'un "standard" rétrécir façon de le faire avec une application Java, mais il est certainement une bonne idée (vous voulez bénéficier de la garder en vie et les capacités de surveillance du système d'exploitation si elles sont là). C'est sur la feuille de route de fournir quelque chose à partir du Printemps de Démarrage de l'outil de support (maven et gradle), mais pour l'instant, vous allez probablement avoir à déployer votre propre. La meilleure solution que je connaisse actuellement est Contremaître, qui a une approche déclarative et une ligne de commandes pour l'emballage des scripts d'initialisation pour diverses standard de l'OS formats (monit, sys V, arriviste, etc.). Il existe également des preuves de personnes ayant mis des trucs avec gradle (par exemple ici).
Êtes-vous à l'aide de Maven? Alors vous devriez essayer le AppAssembler Plugin:
Voir: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
J'ai fini par faire systemd service pour la GUERRE/JAR disposition
Je vais appeler java-jar car il est plus souple. On a aussi essayé de mettre le ExecStart=spring-mvc.à la guerre, mais même s'il est exécutable, je les ai Exec, une erreur de format'
De toute façon ces jours-ci, systemd est présent sur toutes les distros, et offre une belle solution pour rediriger les logs(syserr est important lorsque vous service n'a même pas commencer à log4j emplacement du fichier est vide 🙂 ).
rsyslog - redirection syslog d'entrée à partir de l'app spécifiques de dossier/fichier
logrotate
logrotate gc
Suite à du Tchad excellente réponse, si vous obtenez une erreur de "Erreur: impossible de trouver ou charger la classe principale" - et vous de passer quelques heures à essayer de le résoudre, si votre exécution d'un script shell qui lance votre application java ou de départ à partir de systemd lui-même - et vous savez que votre classpath est correct à 100%, par exemple manuellement en exécutant le script shell fonctionne aussi bien que l'exécution de ce que vous avez dans systemd execstart. Assurez-vous vous êtes en cours d'exécution des choses que l'utilisateur correct! Dans mon cas, j'avais essayé différents utilisateurs, après un certain temps de dépannage - j'ai enfin eu un pressentiment, mettre root comme utilisateur - voila, l'application a démarré correctement. Après avoir déterminé que c'était un mauvais utilisateur problème, je
chown -R user:user
le dossier et sous-dossiers et de l'application couru correctement que l'utilisateur et de groupe, ce n'est plus nécessaire pour l'exécuter en tant que root (mauvaise).Dans systemd unité de fichiers, vous pouvez définir des variables d'environnement de répertoire ou par l'intermédiaire d'un
EnvironmentFile
. Je souhaiterais vous proposer de faire les choses de cette façon puisque ça semble être le moins de friction.Unité d'échantillonnage du fichier
Puis l'installation d'un fichier sous
/etc/sysconfig/hello-world
qui comprend en majuscules les noms de vos Printemps variables de Démarrage. Par exemple, une variable appeléeserver.port
de suivre la formeSERVER_PORT
comme une variable d'environnement:Le mécanisme être exploité ici est que le Printemps applications de Démarrage prendra la liste des propriétés et ensuite les traduire, rendant le tout en majuscules, et en remplaçant les points par des caractères de soulignement. Une fois que le Ressort de Démarrage de l'app va par le biais de ce processus, il se penche ensuite pour les variables d'environnement qui correspondent, et utilise toute trouvée en conséquence.
C'est examinée plus en détail dans ce Q&Un intitulé: Comment définir un Printemps de Démarrage de la propriété avec un trait de soulignement dans son nom via des Variables d'Environnement?
Références
Il peut être fait en utilisant Systemd service dans Ubuntu
Vous pouvez suivre ce lien pour plus élaboré description et les différentes façons de le faire.
http://www.baeldung.com/spring-boot-app-as-a-service