Es gibt Unterschiede zwischen nohup
, disown
und&
(Sie können auch finden diese Antwort interessant).
Die von disown command
Ihnen verwendete Syntax ist zumindest in Bash ungültig. sehen help disown
. In manchen Fällen command & disown
reicht das aber
[
command
] ist immer noch mit dem Terminal verbunden. Wenn das Terminal zerstört wird, [...] schlägt das Programm fehl, sobald versucht wird, von der Standardeingabe zu lesen oder in die Standardausgabe zu schreiben.
So nohup command &
scheint es aber besser
nohup
entfernt den Prozess nicht aus der Jobsteuerung der Shell
Das scheint ziemlich harmlos zu sein, aber wenn es Sie stört, nur disown
den Job:
nohup command & disown
Wenn der Job jedoch vor disown
Acts beendet wird, werden Sie einen anderen Job (falls vorhanden) ablehnen . Der richtige Weg, dies in Bash zu tun ist, zu verwenden$!
:
$!
Wird auf die Prozess-ID des zuletzt in den Hintergrund gesetzten Jobs erweitert
Also das ist besser:
nohup command & disown $!
(Da disown
danach nohup
meistens kosmetisch ist, werde ich es von nun an weglassen. Benutze es, wenn du es brauchst).
Um cd
vor, command
ohne den aktuell Shell zu beeinflussen, ist der beste Weg, um es in einer Subshell zu tun (Du versuchen es, aber nicht mit nohup
):
(cd path && nohup command) &
oder auch
(cd path && exec nohup command) &
wo exec
macht nohup
den Subshell Prozess ersetzen, die nicht mehr benötigt wird; nohup
wird dann ersetzt durch, command
weil das Werkzeug so funktioniert. Auf diese Weise erhalten Sie einen Prozess anstelle von vielen.
Alternativ können Sie auch nohup
eine ganze Shell verwenden. Dadurch können Sie mehrere Befehle ausführen:
nohup sh -c 'cd path || exit; command1; command2' &
(In diesem Fall exec
macht das nur vorher Sinn command2
).
Hinweis nohup
erstellt eine Datei nohup.out
, sofern Sie die Ausgabe nicht umleiten (siehe man 1 nohup
). Wo die Datei erstellt wird, hängt vom aktuellen Arbeitsverzeichnis des nohup
Prozesses ab. Daher macht es im Allgemeinen einen Unterschied, ob Sie cd
vorher nohup
( cd path && nohup ...
) oder umgekehrt ( nohup sh -c 'cd path ... '
) vorgehen.