J'ai écrit une application serveur Java qui s'exécute sur une solution Linux hébergée virtuelle standard. L'application s'exécute tout le temps en écoutant les connexions de socket et en créant de nouveaux gestionnaires pour elles. Il s'agit d'une implémentation côté serveur vers une application client-serveur.
La façon dont je le démarre est de l'inclure dans le script de démarrage rc.local du serveur. Cependant une fois démarré je ne sais pas comment y accéder pour l'arrêter et si je veux installer une mise à jour, je dois donc redémarrer le serveur afin de redémarrer l'application.
Sur un PC Windows, pour ce type d'application, je peux créer un service Windows, puis je peux l'arrêter et le démarrer comme je le souhaite. Y a-t-il quelque chose comme ça sur une machine Linux pour que si je lance cette application, je puisse l'arrêter et la redémarrer sans faire un redémarrage complet du serveur.
Mon application s'appelle WebServer.exe. Il est lancé au démarrage du serveur en l'incluant dans mon rc.local en tant que tel:
java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &
Je suis un peu noob chez Linux, donc tout exemple serait apprécié avec tous les messages. Cependant, j'ai SSH et un accès FTP complet à la boîte pour installer les mises à jour ainsi que l'accès à un panneau Plesk.
Une solution simple consiste à créer un script start.sh qui exécute Java via nohup, puis stocke le PID dans un fichier:
Ensuite, votre script d'arrêt stop.sh lirait le PID à partir du fichier et tuerait l'application:
Bien sûr, j'ai omis certains détails, comme vérifier si le processus existe et supprimer
pid.txt
si vous avez terminé.la source
Le script d'initialisation du service Linux est stocké dans
/etc/init.d
. Vous pouvez copier et personnaliser le/etc/init.d/skeleton
fichier, puis appelervoir http://www.ralfebert.de/blog/java/debian_daemon/ . C'est pour Debian (donc, Ubuntu aussi) mais convient à plus de distribution.
la source
Peut-être pas la meilleure solution dev-ops, mais bonne pour l'utilisation générale d'un serveur pour une partie LAN ou similaire.
Utilisez
screen
pour exécuter votre serveur puis détachez-le avant de vous déconnecter, cela maintiendra le processus en cours d'exécution, vous pouvez ensuite le reconnecter à tout moment.Flux de travail:
Démarrez un écran:
screen
Démarrez votre serveur:
java -jar minecraft-server.jar
Détacher en appuyant sur:
Ctl-a
,d
Re-attacher:
screen -r
Plus d'informations ici: https://www.gnu.org/software/screen/manual/screen.html
la source
Une autre alternative, qui est également très populaire, est le Java Service Wrapper . Ceci est également très populaire dans la communauté OSS.
la source
En ce qui concerne également l' application Spring Boot en tant que service ,
systemd
j'opterais pour la version, car elle est la plus simple, la moins verbeuse et la mieux intégrée dans les distributions modernes (et même dans les distributions pas si modernes comme CentOS 7.x).la source
Le moyen le plus simple est d'utiliser
supervisord
. Veuillez consulter tous les détails ici: http://supervisord.org/Plus d'informations:
/ubuntu/779830/running-an-executable-jar-file-when-the-system-starts/852485#852485
https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps
la source
Voici un exemple de script shell (assurez-vous de remplacer le nom MATH par le nom de votre application):
la source
À partir de l' application Spring Boot en tant que service , je peux recommander l'
supervisord
application basée sur Python . Consultez cette question sur le débordement de pile pour plus d'informations. C'est vraiment simple à mettre en place.la source
supervisord
est génial, pour ceux qui ne le savent pas, cela permet de surveiller les services (ce qui doit êtreforeground
- nondaemonized
), il redémarrera ensuite automatiquement les services (et peut envoyer des alertes par courrier électronique lorsque les redémarrages se produisent via des plugins)D'autres réponses font un bon travail en donnant des scripts et des configurations personnalisés en fonction de votre plate-forme. En plus de ceux-ci, voici les programmes matures et spéciaux que je connais:
la source
Vous pouvez utiliser le serveur Thrift ou JMX pour communiquer avec votre service Java.
la source
À partir du guide de référence Spring Boot
continuer la lecture pour savoir comment sécuriser un service déployé.
Après avoir fait ce que j'ai écrit, j'ai découvert que mon service ne démarre pas avec ce message d'erreur dans les journaux: start-stop-daemon: option non reconnue --no-close . Et j'ai réussi à le réparer en créant un fichier de configuration
/var/myapp/myapp.conf
avec le contenu suivantla source
J'ai l'application Netty java et je veux l'exécuter en tant que service avec systemd. Malheureusement, l'application s'arrête quel que soit le type que j'utilise. À la fin, j'ai enveloppé le début de java à l'écran. Voici les fichiers de configuration:
un service
début
à partir de ce moment, vous pouvez utiliser
systemctl [start|stop|status] service
.la source
Pour exécuter du code Java en tant que démon (service), vous pouvez écrire un stub basé sur JNI.
http://jnicookbook.owsiak.org/recipe-no-022/
pour un exemple de code basé sur JNI. Dans ce cas, vous démonisez le code qui a été démarré en Java et la boucle principale est exécutée en C. Mais il est également possible de placer la boucle de service main, daemon, dans Java.
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo029
Amusez-vous avec JNI!
la source
Vous pouvez écrire un simple script d'arrêt qui greps pour votre processus java, extrait le PID et appelle kill dessus. Ce n'est pas chic, mais c'est simple. Quelque chose comme ça peut être utile pour commencer:
la source
pkill nameofprocess
je ne fais pas la même chose?Il est possible d'exécuter la guerre en tant que service Linux, et vous voudrez peut-être forcer votre fichier pom.xml avant l'empaquetage, car certaines distributions peuvent ne pas reconnaître en mode automatique. Pour ce faire, ajoutez la propriété suivante à l'intérieur du plugin spring-boot-maven-plugin.
Ensuite, configurez votre init.d avec:
et tu pourras courir
Il existe de nombreuses autres options que vous pouvez trouver dans la documentation de Spring Boot , y compris le service Windows.
la source