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.
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&
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é.
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.
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
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.
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).
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
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.
la façon La plus simple est d'utiliser supervisord
. S'il vous plaît voir tous les détails ici: http://supervisord.org /
complément d'information:
vous pouvez utiliser Thrift server ou JMX pour communiquer avec votre service Java.
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.
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!
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
À 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 normestart
,stop
,restart
et les commandesstatus
. 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
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