Ich habe eine Java-Socket-Server-Verbindung entwickelt, die einwandfrei funktioniert.
Beim Starten von einem Terminal aus wird vom Client abgehört. Aber wenn ich das Terminal schließe, hört es auf zu hören.
Ich muss fortfahren, obwohl das Terminal durch den Benutzer geschlossen wurde, von dem aus die JAR-Datei gestartet wurde.
Wie kann ich Java Server Socket-Anwendung in Linux als Hintergrundprozess ausführen?
Es gibt mehrere Möglichkeiten, wie Sie so etwas erreichen können:
Nohup Java -server myApplication.jar > /log.txt
- das ist ziemlich einfach. Die Anwendung wird einfach in den Hintergrund gestellt. Das wird funktionieren, aber es ist einfach kein guter Weg, dies zu tun.init.d
und dem erforderlichen Runlevel mit regulären Start-, Stopp- und Statusbefehlen enthalten sein. Ich kann bei Bedarf ein Beispiel geben.Ich persönlich würde mit Lösung 2 oder 3 gehen, wenn Sie diesen Server in der Zukunft verwenden und/oder an Clients, Endbenutzer usw. verteilen möchten. Nohup
ist gut, wenn Sie etwas ausführen müssen und keine Zeit dafür haben eine komplexere Lösung für das Problem entwickeln.
Anzeige 2:
Die besten Skripte, die in vielen Projekten verwendet werden, finden Sie hier .
Für Debian/Ubuntu kann ein sehr einfaches Skript verwendet werden, das auf start-stop-daemon
basiert. Im Zweifelsfall kann /etc/init.d/skeleton
geändert werden.
#!/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
Nachdem Sie einen &
am Ende des Befehls hinzugefügt haben, müssen Sie unbedingt etwas hinzufügen. Der Prozess ist immer noch mit dem Terminal verbunden. Sie müssen disown
ausführen, nachdem Sie den Java-Befehl ausgeführt haben.
Java -jar yourApp.jar > log.txt &
disown
Jetzt können Sie das Terminal schließen.
Der Schlüsselwortsatz, den Sie hier benötigen, lautet "Daemonisieren eines Prozesses". Überhaupt gewundert, warum System-Server-Prozesse oft unter Linux/Unix enden? Das "d" steht aus historischen Gründen für "Daemon".
Daher wird der Prozess des Abnehmens und des Werdens eines echten Serverprozesses "Daemonisierung" genannt.
Es ist völlig allgemein und nicht nur auf Java-Prozesse beschränkt.
Es gibt mehrere Aufgaben, die Sie ausführen müssen, um ein wirklich unabhängiger Dämonprozess zu werden. Sie sind auf der Wikipedia-Seite aufgeführt.
Die zwei wichtigsten Dinge, über die Sie sich Sorgen machen müssen, sind:
Wenn Sie den Ausdruck "Daemonisieren eines Prozesses" bei Google googeln, finden Sie eine Reihe von Möglichkeiten, dies zu erreichen, und einige Details dazu, warum dies notwendig ist.
Die meisten Leute würden nur ein kleines Shell-Skript verwenden, um den Java-Prozess zu starten, und dann den Java-Befehl mit einem "&" beenden, um im Hintergrundmodus zu starten. Wenn der Startskriptprozess dann beendet ist, wird der Java-Prozess noch ausgeführt und vom jetzt nicht mehr aktiven Skriptprozess getrennt.
Haben Sie versucht, & am Ende der Befehlszeile zu platzieren? Zum Beispiel:
Java -jar mySocketApp.jar &
Sie können auch die Befehle bg und fg verwenden, um einen Prozess in den Hintergrund und in den Vordergrund zu senden. Sie können den laufenden Prozess mit STRG + Z unterbrechen.
Schauen Sie sich diesen Artikel an: http://lowfatlinux.com/linux-processes.html
versuchen,
Java -jar yourApp.jar &
&
startet neuen Prozessthread, ich habe dies nicht getestet, aber wenn es immer noch nicht funktioniert, dann twite es in der Skriptdatei und starte i mit &
Schritt 1.
Neuen Bildschirm erstellen
screen -RD screenname
Schritt 2.
In das Bildschirm-Terminal einsteigen
press Enter
Schritt 3.
Führen Sie Ihren Befehl oder Ihr Skript (zur Ausführung im Hintergrund) im neu geöffneten Terminal aus
Schritt 4.
Aus dem Bildschirmterminal herauskommen
ctrl + A + D
Schritt 5.
Bildschirmterminals auflisten
screen -ls
das wird etwas wie unten drucken
There is a screen on:
994.screenname (12/10/2018 09:24:31 AM) (Detached)
1 Socket in /run/screen/S-contact.
Schritt 6.
Um sich im Hintergrundprozess anzumelden
screen -rd 994.screenname