Führen Sie die Java-JAR-Datei auf einem Server als Hintergrundprozess aus

105

Ich muss ein Java-JAR auf dem Server ausführen, um zwischen zwei Anwendungen zu kommunizieren. Ich habe zwei Shell-Skripte geschrieben, um es auszuführen, aber sobald ich dieses Skript gestartet habe, kann ich den Prozess nicht herunterfahren / beenden. Wenn ich ctrl+ drücke Coder die Konsole schließe, wird der Server heruntergefahren. Kann mir jemand helfen, wie ich dieses Skript so ändern kann, dass es als normaler Server ausgeführt wird?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid
Bernad Ali
quelle

Antworten:

242

Sie können dies versuchen:

#!/bin/sh
nohup java -jar /web/server.jar &

Das Symbol & schaltet das Programm so, dass es im Hintergrund ausgeführt wird.

Mit dem Dienstprogramm nohup wird der Befehl als Argument übergeben, das auch nach dem Abmelden im Hintergrund ausgeführt wird.

Anton Beloglazov
quelle
Vielen Dank, Anton. Derzeit stoppe ich den Server, indem ich die Prozess-ID beende. Ich glaube nicht, dass dies die beste Vorgehensweise ist. Ist es Ihr Befehl, den Server zu stoppen?
Bernad Ali
3
Kurze Antwort: Es kommt auf den Server an. Lange Antwort: Soweit ich weiß, gibt es keinen sicheren Weg, einen Prozess herunterzufahren, ohne dass der Prozess solch ordnungsgemäße Abschaltungen unterstützt. Wenn es sich beispielsweise um einen Webserver handelt, der durch ein externes Signal beendet wird, besteht immer die Möglichkeit, dass einige Anforderungen verloren gehen. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, eine ordnungsgemäße Beendigungsfunktion im Server selbst zu implementieren, z. B. durch Verarbeiten einer speziellen Art von Anforderungen. Dann kann der Server beendet werden, indem eine Anfrage dieser besonderen Art gesendet wird. Andernfalls ist das Beenden des Prozesses anhand seiner ID der einfache Weg.
Anton Beloglazov
1
Die Verwendung nohupsollte immer mit der expliziten Umleitung von stdout und stderr kombiniert werden. Andernfalls erhalten Sie keine Kontrolle darüber, wohin die Protokolle gehen, und es wird hässlich nohup.outerstellt, in welchem ​​Verzeichnis dieses Skript gerade aufgerufen wird.
Charles Duffy
@Anton, wenn ich ein Skript (genau wie Ihre Antwort) mit SSH EXEC runjar.sh ausführe. Es begann mit dem Streaming der Protokolle in meinem lokalen Terminal und wenn mein Terminal geschlossen wird, wird mein Glas getötet. Wie kann ich mit SSH EXEC ein Glas im Hintergrund ausführen?
AATHITH RAJENDRAN
45

Systemd, das jetzt in den meisten Distributionen läuft

Schritt 1:

Finden Sie Ihre benutzerdefinierten Dienste, bei denen meine war /usr/lib/systemd/system/

Schritt 2:

Erstellen Sie eine Textdatei mit dem Namen Ihres bevorzugten Texteditors whatever_you_want.service

Schritt 3:

Fügen Sie die folgende Vorlage in die Datei einwhatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

Schritt 4:

Führen Sie Ihren Dienst
als Superuser aus

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service
mtelesha
quelle
Dies ist die moderne Art, es zu tun
EarthMind
4
auf aws ubutnu image musste ich systemd installieren und fand dann das image in / etc / systemd / system /
Robbo_UK
29

Wenn Sie Ubuntu verwenden und "Upstart" ( http://upstart.ubuntu.com/ ) haben, können Sie Folgendes versuchen:

Erstellen /var/init/yourservice.conf

mit folgendem Inhalt

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

Jetzt können Sie die Befehle service yourservice startund ausgeben service yourservice stop. Sie können nachverfolgen /var/log/yourservice.log, ob es funktioniert.

Wenn Sie Ihr Glas nur von der Konsole aus ausführen möchten, ohne das Konsolenfenster zu belasten, können Sie Folgendes tun:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1
Strelok
quelle
3
Ist das ein systemd Service? Diese Frage ist nicht mit Linux gekennzeichnet, und nur sehr wenige Distributionen haben standardmäßig systemd.
Jordanm
1
Ich werde die Frage dahingehend ändern, dass hierfür "upstart" verwendet wird, der in Ubuntu enthalten ist.
Strelok
1
Ich glaube, für den letzten Rat, wenn Sie möchten, dass es im Hintergrund läuft und die Shell freigegeben wurde, sollten Sie java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Folgendes
Alle Systemjobs befinden sich standardmäßig im folgenden Verzeichnis: / etc / init / ... Standardmäßig gibt es in Ubuntu 14.04 kein Verzeichnis / var / init /.
Michael Lafayette
Zum Starten eines Dienstes ist außerdem "sudo" erforderlich. Sudo Service Yourservice Start
Michael Lafayette
2

Führen Sie es im Hintergrund aus und fügen Sie der Protokolldatei folgende Protokolle hinzu:

nohup java -jar /web/server.jar > log.log 2>&1 &
KayV
quelle