it-swarm.com.de

Hintergrundprozess in Linux

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?

23
user861973

Es gibt mehrere Möglichkeiten, wie Sie so etwas erreichen können:

  1. 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.
  2. Verwenden Sie einen Shell-Wrapper und die obigen OR daemon app. Dieser Ansatz wird von vielen Open-Source-Projekten verwendet und ist für die meisten Szenarien gut geeignet. Zusätzlich kann es in init.d und dem erforderlichen Runlevel mit regulären Start-, Stopp- und Statusbefehlen enthalten sein. Ich kann bei Bedarf ein Beispiel geben.
  3. Erstellen Sie Ihren eigenen Dämonserver mit Java Service Wrapper oder Apache Jakarta Commons Daemon . Auch hier sind beide äußerst beliebt, getestet und zuverlässig. Und sowohl für Linux als auch für Windows verfügbar! Der von Apache Commons wird vom Tomcat-Server verwendet! Zusätzlich gibt es Akuma .

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
31
Łukasz Rżanek

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.

5
skyronic

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:

  • Trennen Sie sich vom übergeordneten Prozess
  • Trennen Sie das tty, das den Prozess erstellt hat

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.

3
kittylyst

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

1
Ata S.

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
0
SuperNova