Exécuter une Application Java comme un Service sous Linux

j'ai écrit une application Java server qui tourne sur une solution Linux virtuelle hébergée standard. L'application fonctionne tout le temps en écoutant les connexions de socket et en créant de nouveaux gestionnaires pour eux. Il s'agit d'une implémentation côté serveur d'une application client-serveur.

la façon dont je commence c'est en l'incluant dans la start-up rc.script local du serveur. Cependant, une fois commencé, je ne sais pas comment accéder à l'arrêter et si je veux pour installer une mise à jour, j'ai donc redémarrer le serveur afin de redémarrer l'application.

sur un PC windows, pour ce type d'application je pourrais créer un service windows et puis je peux arrêter et démarrer comme je veux. Est-ce qu'il y a quelque chose comme ça sur une machine Linux pour que si je démarre 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 démarré au démarrage du serveur en l'incluant dans ma rc.local en tant que tel:

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

Je suis un peu un noob à Linux donc n'importe quel exemple serait apprécié avec n'importe quel message. Cependant, j'ai SSH, et un accès FTP complet à la boîte pour installer toutes les mises à jour ainsi que l'accès à un panneau Plesk.

110
demandé sur javaPlease42 2012-06-26 12:32:33

14 réponses

j'ai écrit un autre emballage ici:

#!/bin/sh
SERVICE_NAME=MyService
PATH_TO_JAR=/usr/local/MyProject/MyJar.jar
PID_PATH_NAME=/tmp/MyService-pid
case  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 l'initialisation.d ici et pour systemd (ubuntu 16+) ici

si vous avez besoin du journal de sortie remplacer le 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&
218
répondu PbxMan 2017-11-20 12:36:32

une solution simple est de créer un script start.sh qui exécute Java à travers nohup et stocke ensuite le PID dans un fichier:

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

puis votre script d'arrêt stop.sh lire le PID à partir du dossier et tuer la demande:

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

bien sûr, j'ai omis certains détails, comme vérifier si le processus existe et supprimer pid.txt si vous avez terminé.

44
répondu Wernsey 2012-06-26 08:41:43

service Linux script d'initialisation sont stockés dans des /etc/init.d . Vous pouvez copier et personnaliser /etc/init.d/skeleton fichier, puis appeler

service [yourservice] start|stop|restart

voir http://www.ralfebert.de/blog/java/debian_daemon / . C'est Pour Debian (donc aussi pour Ubuntu), mais il y a plus de distribution.

30
répondu Arcadien 2014-10-15 11:46:38

peut-être pas la meilleure solution dev-ops, mais bon pour l'utilisation générale d'un serveur pour une partie lan ou similaire.

utilisez screen pour lancer votre serveur et ensuite vous déconnecter avant de vous déconnecter, cela maintiendra le processus en cours, vous pouvez ensuite vous ré-attacher à tout moment.

"1519110920 de Workflow":

Démarrer un écran: screen

démarrer votre serveur: java -jar minecraft-server.jar

détacher par pressage: Ctl-a , d

re-attachment: screen -r

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

9
répondu Peter Peterson 2015-06-13 21:21:16

une autre alternative, qui est également très populaire est le Java Service Wrapper . Cela est également très populaire dans la communauté des logiciels libres.

7
répondu carlspring 2012-06-26 08:40:23

se référant à application de Botte à ressort comme un Service aussi, je choisirais la version systemd , car c'est le plus facile, le moins verbeux, et le mieux intégré dans les distros modernes (et même les pas-si-modernes comme CentOS 7.x).

5
répondu yglodt 2017-05-23 12:34:39

voici un exemple de script shell (assurez-vous de remplacer le nom mathématique par le nom de votre application):

#!/bin/bash

### BEGIN INIT INFO
# Provides:                 MATH
# Required-Start:           $java
# Required-Stop:            $java
# Short-Description:        Start and stop MATH service.
# Description:              -
# Date-Creation:            -
# Date-Last-Modification:   -
# Author:                   -
### END INIT INFO

# Variables
PGREP=/usr/bin/pgrep
JAVA=/usr/bin/java
ZERO=0

# Start the MATH
start() {
    echo "Starting MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        echo "The service is already running"
    else
        #Run the jar file MATH service
        $JAVA -jar /opt/MATH/MATH.jar > /dev/null 2>&1 &
        #sleep time before the service verification
        sleep 10
        #Verify if the service is running
        $PGREP -f MATH  > /dev/null
        VERIFIER=$?
        if [ $ZERO = $VERIFIER ]
        then
            echo "Service was successfully started"
        else
            echo "Failed to start service"
        fi
    fi
    echo
}

# Stop the MATH
stop() {
    echo "Stopping MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        #Kill the pid of java with the service name
        kill -9 $($PGREP -f MATH)
        #Sleep time before the service verification
        sleep 10
        #Verify if the service is running
        $PGREP -f MATH  > /dev/null
        VERIFIER=$?
        if [ $ZERO = $VERIFIER ]
        then
            echo "Failed to stop service"
        else
            echo "Service was successfully stopped"
        fi
    else
        echo "The service is already stopped"
    fi
    echo
}

# Verify the status of MATH
status() {
    echo "Checking status of MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        echo "Service is running"
    else
        echo "Service is stopped"
    fi
    echo
}

# Main logic
case "" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart|reload)
        stop
        start
        ;;
  *)
    echo $"Usage: "151900920" {start|stop|status|restart|reload}"
    exit 1
esac
exit 0
4
répondu Matheus Oliveira 2017-03-20 14:43:13

de application de démarrage à ressort comme un Service , je peux recommander l'application supervisord basée sur Python. Voir la question sur le débordement de la pile pour plus d'informations. C'est vraiment simple à mettre en place.

3
répondu DuffJ 2017-05-23 12:18:13

vous pouvez utiliser Thrift server ou JMX pour communiquer avec votre service Java.

1
répondu tienthanhakay 2012-06-26 09:35:55

D'autres réponses font un bon travail en donnant des scripts personnalisés et des configurations en fonction de votre plate-forme. En plus de ceux-ci, voici les programmes Matures, spéciaux que je connais:

  • JSW from TanukiSoftware
  • YAJSW est un clone open source de ce qui précède. Il est écrit en Java, et c'est un processus nanny qui gère le processus enfant (votre code) selon les configurations. Fonctionne sous windows / linux.
  • JSVC est une application native. C'est aussi un processus nounou, mais il invoque votre application enfant à travers le JNI, plutôt que comme un sous-processus.
1
répondu Mori Bellamy 2017-03-16 03:40:43

pour exécuter le code Java en tant que daemon (service), vous pouvez écrire stub basé sur JNI.

http://jnicookbook.owsiak.org/recipe-no-022 /

pour un code échantillon basé sur JNI. Dans ce cas, vous daemonisez le code qui a été démarré comme Java et main loop est exécuté en C. Mais il est également possible de mettre main, daemon's, service loop à L'intérieur de Java.

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

amusez-vous bien avec JNI!

1
répondu Oo.oO 2017-06-05 07:34:05

Cependant, une fois commencé, je ne sais pas comment accéder à l'arrêter

vous pouvez écrire un simple script stop qui saisit 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 comme point de départ:

#!/bin/bash
PID = ps ax | grep "name of your app" | cut -d ' ' -f 1
kill $PID
0
répondu hovanessyan 2012-06-26 08:41:07

À Partir De Printemps De Démarrage Guide De Référence

Installation comme une init.D service (System V)

il suffit de faire un lien symbolique entre le bocal et init.d pour soutenir la norme start , stop , restart et les commandes status . En supposant que vous avez une application de démarrage à ressort installée dans /var/myapp, pour installer une application de démarrage à ressort comme init.D service 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 les erreurs dans le fichier journal écrit /var/log/<appname>.log .

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

après avoir fait comme écrit, j'ai découvert que mon service ne démarre pas avec ce message d'erreur dans logs: start-stop-daemon: unreognized option --no-close . Et j'ai réussi à le corriger en créant un fichier de configuration /var/myapp/myapp.conf avec le contenu suivant

USE_START_STOP_DAEMON=false
0
répondu naXa 2018-01-29 15:54:00