2012-02-24 4 views
22

J'ai développé une connexion serveur Java qui fonctionne correctement.Processus d'arrière-plan sous Linux

Lorsqu'il est démarré à partir d'un terminal, il commence à être écouté par le client. Mais quand je ferme le terminal, il cesse d'écouter.

Je dois continuer même si le terminal est fermé par l'utilisateur à partir duquel le fichier jar a été démarré. Comment puis-je exécuter une application Java socket socket sous Linux en tant que processus en arrière-plan?

+0

http://stackoverflow.com/questions/2151214/is-it-possible-to-double-fork-a-process-in-java – tMC

Répondre

30

Il y a plusieurs façons que vous pouvez 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 pas un très bon moyen de le faire.
  2. Utilisez une enveloppe de shell et l'application OU daemon ci-dessus. Cette approche est utilisée par de nombreux projets open source et elle est plutôt bonne pour la plupart des scénarios. De plus, il peut être inclus dans init.d et le niveau d'exécution requis avec les commandes régulières de démarrage, d'arrêt et d'état. Je peux fournir un exemple si nécessaire. Créez votre propre serveur démon à l'aide de Java Service Wrapper ou de 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, j'aller avec une solution 2 ou 3 si vous avez besoin d'utiliser ce serveur dans le futur et/ou le distribuer aux clients, utilisateurs finaux, etc. nohup est bon si vous avez besoin d'exécuter quelque chose et pas temps de développer une solution plus complexe pour le problème.

Annonce 2:

Les meilleurs scripts, utilisé par de nombreux projets, se trouve here. Pour Debian/Ubuntu, on peut utiliser un script très simple basé sur le start-stop-daemon. En cas de doute, il est /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 
+0

Rzanek Merci d'avoir répondu. Je veux aller avec l'option 2. Si vous pouvez me donner un exemple. – user861973

1

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

java -jar mySocketApp.jar & 

Vous pouvez également utiliser bg et fg commandes pour envoyer un processus arrière-plan et de premier plan. Vous pouvez mettre en pause le processus en cours par CTRL + Z.

Check it cet article: http://lowfatlinux.com/linux-processes.html

1

essayer,

java -jar yourApp.jar & 

& commencera nouveau thread de processus, je n'ai pas testé, mais si encore pas les œuvres twite puis dans le fichier de script et commencez avec &

5

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.

+1

Cette commande ne fonctionnait pas pour moi j'avais besoin de 'java -jar yourApp .jar> log.txt & 'en utilisant ubuntu, pas' & 'à la fin – wired00

3

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 en 'd' sous Linux/Unix? Le 'd' signifie "daemon", pour des raisons historiques. Ainsi, le processus de détachement et de devenir un vrai processus de serveur s'appelle «démonisation».

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

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

Les deux principales choses dont vous avez besoin à vous soucier sont:

  • Détacher du processus parent
  • Détacher du téléscripteur qui a créé le processus

Si vous google l'expression « daemonizing une processus ", vous trouverez un tas de façons d'accomplir cela, et d'autres détails sur les raisons pour lesquelles cela est nécessaire.

La plupart des gens utiliseraient simplement un petit script shell pour lancer le processus java, et finiraient 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 désormais disparu.

Questions connexes