web-dev-qa-db-fra.com

Processus d'arrière-plan sous Linux

J'ai développé une connexion Java au serveur de socket qui fonctionne bien.

Lorsqu'il est démarré depuis un terminal, il commence à écouter du client. Mais lorsque je ferme le terminal, il cesse d'écouter.

Je dois continuer même si le terminal a été fermé par l'utilisateur à partir duquel le fichier jar a été lancé.

Comment puis-je exécuter une application de socket serveur Java sous Linux en tant que processus d'arrière-plan?

23
user861973

Il y a plusieurs façons de réaliser une telle chose:

  1. Nohup Java -server myApplication.jar > /log.txt - c'est assez simple. Il ne fera que mettre l'application en arrière-plan. Cela fonctionnera, mais ce n’est tout simplement pas un très bon moyen de le faire.
  2. Utilisez un wrapper Shell et le OR daemon app ci-dessus. Cette approche est utilisée par de nombreux projets open source et convient assez bien à la plupart des scénarios. En outre, il peut être inclus dans init.d et au niveau d'exécution requis avec des commandes de démarrage, d'arrêt et d'état régulières. Je peux donner un exemple si nécessaire.
  3. Construisez votre propre serveur démon en utilisant Java Service Wrapper ou Apache Jakarta Commons Daemon . Encore une fois - les deux sont extrêmement populaires, bien testés et fiables. Et disponible pour Linux et Windows! Celui d'Apache Commons est utilisé par le serveur Tomcat! De plus, il y a Akuma .

Personnellement, je choisirais la solution 2 ou 3 si vous deviez utiliser ce serveur ultérieurement et/ou le distribuer aux clients, aux utilisateurs finaux, etc. Nohup est utile si vous devez exécuter quelque chose sans avoir le temps de développer une solution plus complexe. pour le problème.

Ad 2:

Les meilleurs scripts, utilisés par de nombreux projets, peuvent être trouvés ici

Pour Debian/Ubuntu, on peut utiliser un script très simple basé sur start-stop-daemon. En cas de doute, il y a /etc/init.d/skeleton on peut modifier.

#!/bin/sh

DESC="Description"
NAME=YOUR_NAME
PIDFILE=/var/run/$NAME.pid
RUN_AS=USER_TO_RUN
COMMAND=/usr/bin/Java -- -jar YOUR_JAR

d_start() {
    start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --exec $COMMAND
}

d_stop() {
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    if [ -e $PIDFILE ]
        then rm $PIDFILE
    fi
}

case $1 in
    start)
    echo -n "Starting $DESC: $NAME"
    d_start
    echo "."
    ;;
    stop)
    echo -n "Stopping $DESC: $NAME"
    d_stop
    echo "."
    ;;
    restart)
    echo -n "Restarting $DESC: $NAME"
    d_stop
    sleep 1
    d_start
    echo "."
    ;;
    *)
    echo "usage: $NAME {start|stop|restart}"
    exit 1
    ;;
esac

exit 0
31
Łukasz Rżanek

Il y a une chose cruciale que vous devez faire après avoir ajouté un & à la fin de la commande. Le processus est toujours lié au terminal. Vous devez exécuter disown après avoir exécuté la commande Java.

Java -jar yourApp.jar > log.txt &
disown

Maintenant, vous pouvez fermer le terminal.

5
skyronic

La phrase clé dont vous avez besoin ici est "démoniser un processus". Vous êtes-vous déjà demandé pourquoi les processus du serveur système finissaient souvent par 'd' sous Linux/Unix? Le 'd' signifie "démon", pour des raisons historiques. 

Ainsi, le processus de déconnexion et de devenir un véritable processus serveur est appelé "démonisation".

C'est complètement général et ne se limite pas aux processus Java.

Vous devez effectuer plusieurs tâches pour devenir un processus démon véritablement indépendant. Ils sont répertoriés sur la page Wikipedia.

Les deux choses principales dont vous devez vous soucier sont:

  • Détacher du processus parent
  • Détacher du tty qui a créé le processus

Si vous recherchez la phrase "démonisation d'un processus" sur Google, vous trouverez de nombreuses façons de le faire et plus de détails sur la raison pour laquelle cela est nécessaire. 

La plupart des gens utiliseraient simplement un petit script Shell pour démarrer le processus Java, puis termineraient la commande Java par un '&' pour démarrer en mode arrière-plan. Ensuite, lorsque le processus de script de démarrage se termine, le processus Java est toujours en cours d'exécution et sera détaché du processus de script maintenant mort.

3
kittylyst

Avez-vous essayé de mettre & à la fin de la ligne de commande? Par exemple:

Java -jar mySocketApp.jar &

Vous pouvez également utiliser les commandes bg et fg pour envoyer un processus en arrière-plan et au premier plan. Vous pouvez suspendre le processus en cours d'exécution par CTRL + Z.

Découvrez cet article: http://lowfatlinux.com/linux-processes.html

1
Ata S.

essayer, 

 Java -jar yourApp.jar &

& va démarrer un nouveau processus, je n'ai pas testé cela, mais si cela ne fonctionne toujours pas, twittez-le dans un fichier script et démarrez dans i avec &

1
Nirmal- thInk beYond

Étape 1.

Pour créer un nouvel écran

screen -RD screenname

Étape 2.

Pour entrer dans le terminal de l'écran

press Enter

Étape 3.

Exécutez votre commande ou script (à exécuter en arrière-plan) dans le terminal récemment ouvert

Étape 4.

Sortir du terminal écran

ctrl + A + D

Étape 5.

Pour lister les terminaux à écran

screen -ls

cela va imprimer quelque chose comme ci-dessous

There is a screen on: 994.screenname (12/10/2018 09:24:31 AM) (Detached) 1 Socket in /run/screen/S-contact.

Étape 6.

Pour vous connecter au processus d'arrière-plan

screen -rd 994.screenname
0
SuperNova