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.

243voto

PbxMan Points 2223

J'ai écrit un autre wrapper simple ici :

#!/bin/sh
SERVICE_NAME=MyService
PATH_TO_JAR=/usr/local/MyProject/MyJar.jar
PID_PATH_NAME=/tmp/MyService-pid
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill $PID;
            echo "$SERVICE_NAME stopped ...";
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac 

Vous pouvez suivre un tutoriel complet pour init.d ici et pour systemd (ubuntu 16+) ici

Si vous avez besoin du journal de sortie, remplacez l'option 2

nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &

lignes pour

nohup java -jar $PATH_TO_JAR >> myService.out 2>&1&

50voto

Wernsey Points 3227

Une solution simple consiste à créer un script start.sh qui exécute Java via nohup et enregistre le PID dans un fichier :

nohup java -jar myapplication.jar > log.txt 2> errors.txt < /dev/null &
PID=$!
echo $PID > pid.txt

Ensuite, votre script stop.sh lira le PID du fichier et tuera l'application :

PID=$(cat pid.txt)
kill $PID

Bien entendu, j'ai omis certains détails, comme la vérification de l'existence du processus et la suppression des pid.txt si vous avez terminé.

34voto

Arcadien Points 1427

Linux service init script sont stockés dans le fichier /etc/init.d . Vous pouvez copier et personnaliser /etc/init.d/skeleton et appeler ensuite

service [yourservice] start|stop|restart

voir http://www.ralfebert.de/blog/java/debian_daemon/ . C'est pour Debian (donc Ubuntu aussi) mais convient à d'autres distributions.

14voto

Peter Peterson Points 383

Ce n'est peut-être pas la meilleure solution pour les opérations de développement, mais c'est une bonne solution pour l'utilisation générale d'un serveur dans le cadre d'une fête de lan ou autre.

Utilisation screen pour faire fonctionner votre serveur et vous en détacher avant de vous déconnecter, ce qui maintiendra le processus en cours, et vous pourrez le rattacher à n'importe quel moment.

Flux de travail :

Démarrer un écran : screen

Démarrez votre serveur : java -jar minecraft-server.jar

Détachez en appuyant : Ctl-a , d

Remettre en place : screen -r

Plus d'informations ici : https://www.gnu.org/software/screen/manual/screen.html

7voto

carlspring Points 7885

Une autre alternative, qui est également très populaire, est le Service Java Wrapper . Cette méthode est également très populaire au sein de la communauté OSS.

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