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.
stdout
undstderr
auf einige Dateien - Ihr Prozess durch das Signal als SIGHUP andere getötet werden können, wenn zu schreiben in eine geschlossene Klemme versuchenstdout
/stderr
. Fügen Sie z. B.>/dev/null 2>&1
Ihrem Befehl vor dem&
Jobzeichen hinzu.nohup
- die meisten Implementierungen tun dies standardmäßig, obwohl möglicherweise eine Umleitung erforderlich ist,stdin
z</dev/null
.Antworten:
nohup
Machen Sie das Programm nur immun gegenSIGHUP
undSIGQUIT
signalisieren 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 wirdnohup
.Die bessere Lösung ist,
tmux
oderscreen
, oder wenn Sie verwendenbash
, können Sie versuchen:quelle
disown
, müssen Sie manuell umleiten, z. B. hinzufügen</dev/null &>/dev/null
ssh localhost 'sleep 10m & disown'
.bash
wird nicht beendet.ssh
dass es nicht beendet wird, wenn Programme an das Terminal angeschlossen sind. Das Obige ist jedoch in Ordnung, wenn Sie interaktiv ausführen.nohup
machen den Befehl nicht immun gegenSIGQUIT
, sondern nur gegenSIGHUP
. Dies wäre ausdrücklich gegen den Standard und AFAIK kann nur unter (einigen Versionen von?) Solaris auftreten.Noch eine Option anstelle der (chronisch dysfunktionalen)
nohup
: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 setsid
für weitere Informationen. Im Gegensatz zuscreen
odertmux
ist dies kein Programm, das den Besitz beansprucht und weiterhin ausgeführt wird. Es startet einfach ein Programm in einer eigenen Prozessgruppe .quelle
setsid
ist auf diese Weise vielleicht ein bisschen idiotensicherer. Es überspringt einen von nohup implizierten Schritt (wobei der Prozess von init als Orphan neu übergeordnet wird).nohup
wäre flexibler, wenn Sie den Job möglicherweise später in den Vordergrund stellen möchten.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/
quelle
Versuchen Sie, Ihr nohup mit STDOUT und STDERR-Umleitung auf null auszuführen:
quelle
nohup.out
).nohup java -jar project.jar 2>/dev/null &
aber du weißt offensichtlich nicht was du tust. Noch besser, auch fütternstdin
/dev/null
.