137 votes

Exécuter une application Java en tant que service sous Linux

J'ai écrit une application serveur Java qui fonctionne sur une solution Linux standard hébergée virtuellement. L'application fonctionne en permanence 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 d'une application client-serveur.

Je le démarre en l'incluant dans le programme de démarrage. rc.local script du serveur. Cependant, une fois lancé, 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 pour redémarrer l'application.

Sur un PC Windows, pour ce type d'application, je pourrais créer un service Windows que je pourrais arrêter et démarrer à ma guise. Existe-t-il quelque chose de semblable sur une machine Linux, de sorte que si je démarre cette application, je puisse l'arrêter et la redémarrer sans avoir à redémarrer complètement le serveur.

Mon application s'appelle WebServer.exe. Elle est lancée au démarrage du serveur en l'incluant dans mon fichier rc.local comme tel :

java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &

Je suis un peu novice en matière de Linux, donc tout exemple serait apprécié, quel que soit le message. Cependant, j'ai un accès SSH et un accès FTP complet à la boîte pour installer les mises à jour, ainsi qu'un accès à un panneau Plesk.

1voto

tienthanhakay Points 117

Vous pouvez utiliser Serveur Thrift o JMX pour communiquer avec votre service Java.

1voto

Oo.oO Points 4324

Pour exécuter un 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é lancé en Java et la boucle principale est exécutée en C. Mais il est également possible de placer la boucle principale, la boucle de service du démon, à l'intérieur de Java.

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo029

Amusez-vous bien avec la JNI !

1voto

naXa Points 862

De Guide de référence Spring Boot

Installation en tant que service init.d (Système V)

Il suffit d'établir un lien symbolique entre le bocal et init.d pour soutenir la norme start , stop , restart y status c En supposant que vous ayez une application Spring Boot installée dans /var/myapp, pour installer une application Spring Boot en tant que service init.d, il suffit de créer un lien symbolique :

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

Une fois installé, vous pouvez démarrer et arrêter le service de la manière habituelle. Par exemple, sur un système basé sur Debian :

$ service myapp start

Tip Si votre application ne démarre pas, vérifiez le fichier journal écrit dans le dossier /var/log/<appname>.log pour les erreurs.

Poursuivre la lecture pour savoir comment sécuriser un service déployé.

Après avoir fait ce qui est é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 à résoudre le problème en créant un fichier de configuration /var/myapp/myapp.conf avec le contenu suivant

USE_START_STOP_DAEMON=false

1voto

Eder Luis Jorge Points 50

Il est possible d'exécuter le war en tant que service Linux, et vous pouvez vouloir forcer dans votre fichier pom.xml avant de l'empaqueter, car certaines distros 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.

                    <embeddedLaunchScriptProperties>
                        <mode>service</mode>
                    </embeddedLaunchScriptProperties>

Ensuite, configurez votre init.d avec :

ln -s myapp.war /etc/init.d/myapp

et vous pourrez exécuter

service myapp start|stop|restart

Il existe de nombreuses autres options que vous pouvez trouver dans Documentation Spring Boot y compris le service Windows.

1voto

BunterHund Points 11

J'ai une application Netty java et je veux la faire tourner en tant que service avec systemd. Malheureusement, l'application s'arrête quel que soit le type que j'utilise. A la fin, j'ai intégré le démarrage de java dans l'écran. Voici les fichiers de configuration :

service

[Unit]
Description=Netty service
After=network.target
[Service]
User=user
Type=forking
WorkingDirectory=/home/user/app
ExecStart=/home/user/app/start.sh
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

commencer

#!/bin/sh
/usr/bin/screen -L -dmS netty_app java -cp app.jar classPath

à partir de là, vous pouvez utiliser systemctl [start|stop|status] service .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X