Processus d'arrière - plan sous linux

J'ai développé une connexion Java socket server qui fonctionne bien.

Lorsqu'il est démarré à partir d'un terminal, il commence à écouter depuis le client. Mais quand je ferme le terminal, il arrête d'écouter.

Je dois continuer même si le terminal a été fermé par l'utilisateur d'où le fichier jar a été démarré.

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

23
demandé sur Nayuki 2012-02-24 16:11:48

5 réponses

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 va juste 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 l'application ci-dessus ou daemon. Cette approche est utilisée par de nombreux projets open source et c'est assez bon pour la plupart des scénarios. En outre, il peut être inclus dans init.d et le niveau d'exécution requis avec démarrage régulier, arrêt et statut des commandes. Je peux fournir 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! En outre, il y a Akuma .

Personnellement, j'irais avec la solution 2 ou 3 Si vous avez besoin d'utiliser ce serveur à l'avenir et/ou distribuer aux clients, utilisateurs finaux, etc. nohup est bon si vous avez besoin d'exécuter quelque chose et n'avez pas le temps de développer une solution plus complexe pour le problème.

Ad 2:

Les meilleurs scripts, utilisé 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
répondu Łukasz Rżanek 2012-03-01 20:53:08

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
répondu skyronic 2017-10-20 15:59:29

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 se terminent souvent par " d " Sous Linux / Unix? Le " d " signifie "démon", pour des raisons historiques.

Ainsi, le processus de détachement et de devenir un vrai processus serveur s'appelle "daemonization".

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

Il y a plusieurs tâches que vous devez faire pour devenir un processus démon vraiment indépendant. Ils sont énumérés sur la page Wikipedia.

Les deux principales choses dont vous devez vous inquiéter sont:

  • se détacher du processus parent
  • se détacher du tty qui a créé le processus

Si vous google l'expression "démoniser un processus", vous trouverez un tas de façons d'accomplir cela, et un peu plus de détails sur la raison pour laquelle c'est nécessaire.

La plupart des gens utiliseraient simplement un petit script shell pour démarrer le processus java, puis termineraient la commande java avec 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
répondu kittylyst 2012-02-24 12:40:58

Essayez,

 java -jar yourApp.jar &

& va commencer un nouveau thread de processus, Je n'ai pas testé cela, mais si cela ne fonctionne toujours pas, alors twite-le dans le fichier de script et démarre I avec &

1
répondu Nirmal- thInk beYond 2012-02-24 12:19:29

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 en premier plan. Vous pouvez mettre en pause le processus en cours d'exécution par CTRL + Z .

Vérifier cet article: http://lowfatlinux.com/linux-processes.html

1
répondu Ata S. 2012-02-24 12:27:52