Exécutez le fichier java jar sur un serveur en tant que processus d'arrière-plan

105

J'ai besoin d'exécuter un java jar dans le serveur afin de communiquer entre deux applications. J'ai écrit deux scripts shell pour l'exécuter, mais une fois que j'ai démarré ce script, je ne peux pas arrêter / terminer le processus. Si j'appuie sur ctrl+ Cou ferme la console, le serveur s'arrête. Quelqu'un pourrait-il m'aider à modifier ce script pour qu'il s'exécute en tant que serveur normal?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid
Bernad Ali
la source

Réponses:

242

Vous pouvez essayer ceci:

#!/bin/sh
nohup java -jar /web/server.jar &

Le symbole & fait basculer le programme pour qu'il s'exécute en arrière-plan.

L'utilitaire nohup exécute la commande passée en tant qu'argument en arrière-plan même après la déconnexion.

Anton Beloglazov
la source
Merci Anton, j'arrête actuellement le serveur en tuant le processus id.Je ne pense pas que ce soit la meilleure pratique. La commande est-elle d'arrêter le serveur?
Bernad Ali
3
Réponse courte: cela dépend du serveur. Réponse longue: pour autant que je sache, il n'y a pas de moyen sûr d'arrêter un processus sans que le processus prenne en charge de tels arrêts gracieux. Par exemple, s'il s'agit d'un serveur Web terminé par un signal externe, il est toujours possible que certaines requêtes soient perdues. Une façon de résoudre ce problème consiste à implémenter une fonction de terminaison gracieuse dans le serveur lui-même, par exemple en traitant un type spécial de requêtes. Ensuite, le serveur peut être arrêté en lui envoyant une requête de ce type spécial. Sinon, tuer le processus par son ID est le moyen le plus simple.
Anton Beloglazov
1
L'utilisation nohupdoit toujours être combinée avec la redirection explicite de stdout et stderr - sinon, vous ne contrôlez pas où les journaux vont et vous vous retrouvez avec un laid nohup.outcréé dans le répertoire à partir duquel ce script est appelé.
Charles Duffy
@Anton lorsque j'exécute un script (tout comme votre réponse) avec SSH EXEC runjar.sh. Il a commencé à diffuser les journaux dans mon terminal local et si mon terminal est fermé, mon pot est tué. Comment puis-je exécuter un fichier jar en arrière-plan à l'aide de SSH EXEC?
AATHITH RAJENDRAN
47

Systemd qui fonctionne maintenant dans la majorité des distributions

Étape 1:

Trouvez vos services définis par l'utilisateur que le mien était à /usr/lib/systemd/system/

Étape 2:

Créez un fichier texte avec votre éditeur de texte préféré, nommez-le whatever_you_want.service

Étape 3:

Mettre le modèle suivant dans le fichierwhatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

Étape 4:

Exécutez votre service en
tant que super utilisateur

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service
mtelesha
la source
C'est la façon moderne de le faire
EarthMind
4
sur l'image aws ubutnu, j'ai dû installer systemd puis j'ai trouvé l'image dans / etc / systemd / system /
Robbo_UK
29

Si vous utilisez Ubuntu et que vous avez "Upstart" ( http://upstart.ubuntu.com/ ), vous pouvez essayer ceci:

Créer /var/init/yourservice.conf

avec le contenu suivant

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

Vous pouvez maintenant émettre les commandes service yourservice startet service yourservice stop. Vous pouvez suivre /var/log/yourservice.logpour vérifier que cela fonctionne.

Si vous souhaitez simplement exécuter votre fichier jar à partir de la console sans monopoliser la fenêtre de la console, vous pouvez simplement faire:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1
Strelok
la source
3
Est-ce un service systemd? Cette question n'est pas étiquetée Linux, et très peu de distributions ont systemd par défaut.
jordanm
1
Je modifierai la question pour dire que cela utilise "upstart" qui est inclus dans ubuntu.
Strelok
1
Je crois que pour le dernier conseil, si vous voulez qu'il fonctionne en arrière-plan et que le shell soit sorti, vous devriez faire: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro
Toutes les tâches système par défaut se trouvent dans le répertoire suivant: / etc / init / ... Par défaut, il n'y a pas de répertoire / var / init / dans Ubuntu 14.04.
Michael Lafayette
De plus, le démarrage d'un service nécessite "sudo". sudo service yourservice start
Michael Lafayette
2

Exécutez en arrière-plan et ajoutez des journaux au fichier journal en utilisant les éléments suivants:

nohup java -jar /web/server.jar > log.log 2>&1 &
KayV
la source