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?
Il y a plusieurs façons de réaliser une telle chose:
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.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.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
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.
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:
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.
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
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 &
É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