Prozess Java wird immer noch getötet


11

Ich muss ein Java-Programm auf meinen Universitätsservern ausführen. Ich melde mich remote über ihre Server über ssh an

Also habe ich nohup so benutzt:

nohup java -jar project.jar &

Wenn ich mich jedoch abmelde und das Terminal schließe und mich dann wieder beim Server anmelde, fehlt mein Prozess / wurde abgebrochen.


Versuchen Umleitung stdoutund stderrauf einige Dateien - Ihr Prozess durch das Signal als SIGHUP andere getötet werden können, wenn zu schreiben in eine geschlossene Klemme versuchen stdout/ stderr. Fügen Sie z. B. >/dev/null 2>&1Ihrem Befehl vor dem &Jobzeichen hinzu.
Boris Burkov

1
@Bob sollte bei nicht erforderlich sein nohup- die meisten Implementierungen tun dies standardmäßig, obwohl möglicherweise eine Umleitung erforderlich ist, stdinz </dev/null.
Graeme

Antworten:


14

nohupMachen Sie das Programm nur immun gegen SIGHUPund SIGQUITsignalisieren Sie. Moderne Shell sendet möglicherweise andere Signale, wenn Sie sich von Ihrer Sitzung abmelden. Daher gibt es keine Garantie dafür, dass Ihr Programm nicht beendet wird, auch wenn es nicht ausgeführt wird nohup.

Die bessere Lösung ist, tmuxoder screen, oder wenn Sie verwenden bash, können Sie versuchen:

$ java -jar project.jar &
$ disown

Wenn Sie verwenden disown, müssen Sie manuell umleiten, z. B. hinzufügen</dev/null &>/dev/null
Graeme

@Graeme: Ich denke, wenn wir nicht mehr mit der Shell arbeiten (einfach Befehl ausführen und beenden), besteht keine Notwendigkeit, umzuleiten.
Cuonglm

Versuchen Sie es ssh localhost 'sleep 10m & disown'. bashwird nicht beendet.
Graeme

Ok, es scheint so zu sein, sshdass es nicht beendet wird, wenn Programme an das Terminal angeschlossen sind. Das Obige ist jedoch in Ordnung, wenn Sie interaktiv ausführen.
Graeme

Die Linux- (GNU Coreutils und Busybox) und BSD-Implementierungen von nohupmachen den Befehl nicht immun gegen SIGQUIT, sondern nur gegen SIGHUP. Dies wäre ausdrücklich gegen den Standard und AFAIK kann nur unter (einigen Versionen von?) Solaris auftreten.
Mosvy

13

Noch eine Option anstelle der (chronisch dysfunktionalen) nohup:

setsid java -jar project.jar </dev/zero &>/dev/null &

Dies "dämonisiert" den Prozess effektiv. Es ist jetzt im Besitz von init, wird also niemals HUP-fähig sein, seine E / A-Streams sind sicher und es wurde in den Hintergrund gerückt.

Siehe man setsidfür weitere Informationen. Im Gegensatz zu screenoder tmuxist dies kein Programm, das den Besitz beansprucht und weiterhin ausgeführt wird. Es startet einfach ein Programm in einer eigenen Prozessgruppe .


Warum ist nohup nicht funktionsfähig?
cpugeniusmv

@cpugeniusmv Ich bin sicher, dass es für etwas gut ist, aber ich fand es nicht zuverlässig für einen Zweck, für den es oft empfohlen wird, sich irgendwo anzumelden, einen Prozess zu starten und sich abzumelden (ähnlich wie beim OP). Ich denke, es könnte ein Missbrauch gewesen sein und setsidist auf diese Weise vielleicht ein bisschen idiotensicherer. Es überspringt einen von nohup implizierten Schritt (wobei der Prozess von init als Orphan neu übergeordnet wird). nohupwäre flexibler, wenn Sie den Job möglicherweise später in den Vordergrund stellen möchten.
Goldlöckchen

@ TAFKA'goldilocks 'Ich denke, das Problem liegt im Umgang mit stdin, stdout und stderr, was nicht wirklich (aber teilweise (!)) Von nohup behandelt wird. Nohup macht seine Hauptaufgabe ziemlich gut und schützt den Prozess vor SIGHUP. Aber es gibt viele Dinge, die mit den Streams schief gehen können - oder, schlimmer noch, manchmal schief gehen, abhängig von der Puffergröße. Ich würde sagen, nicht nohup ist falsch, sondern die Erwartung, was nohup tut.
Volker Siegel


-2

Versuchen Sie, Ihr nohup mit STDOUT und STDERR-Umleitung auf null auszuführen:

nohup java -jar project.jar 2>&1 &

1
Sie leiten stderr nur zu stdout um, was nichts an der Funktionsweise von nohup ändert (es leitet beide zu um nohup.out).
Gilles 'SO - hör auf böse zu sein'

1
-1, ich denke du hast es gemeint, nohup java -jar project.jar 2>/dev/null &aber du weißt offensichtlich nicht was du tust. Noch besser, auch füttern stdin /dev/null.
PlasmaPower

@PlasmaPower hier hast du deine +1. Einen schönen Tag noch :)
Boris Quiroz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.