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.

Bigubosu
quelle
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
cuonglm
quelle
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 .

Goldlöckchen
quelle
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
3

Eine andere Idee wäre, den Befehl screen zu verwenden. Es ist möglich, ein Programm mit einem Bildschirm zu starten, abzunehmen und sich abzumelden. Anschließend können Sie sich anmelden und eine Verbindung zur laufenden Bildschirmsitzung herstellen.

Tutorial: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/

Tobias
quelle
-2

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

nohup java -jar project.jar 2>&1 &
boris quiroz
quelle
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