Das kaufmännische Und &
stellt den Prozess in den Hintergrund. Dateideskriptoren (stdout, stderr, stdin) sind nicht betroffen. Beim Beenden der Shell sendet die Shell SIGHUP
an alles, was sie erzeugt hat. Wenn diese Shell geschlossen wird, wird der Hintergrundprozess empfangen SIGHUP
und wahrscheinlich beendet. In einigen Shells (bash, zsh) können Sie dies verhindern, indem Sie den Befehl verwenden, disown
der die Shell anweist, sie SIGHUP
beim Schließen der Shell nicht zu senden , und der Prozess wird weiterhin ausgeführt.
Sie können auch das Äquivalent von "Hintergrund mit einem kaufmännischen Und" ausführen, indem Sie senden SIGSTOP
(normalerweise Strg-Z in Ihrem Terminal) und dann den Prozess hinterlegen ( bg
).
nohup ignoriert SIGHUP. Diese Signaldisposition wird dann an den von Ihnen ausgeführten untergeordneten Prozess übergeben. nohup prüft auch, wohin stdout geht, und wenn es zum Terminal geht, leitet es stdout und stderr in eine Datei um. Nach der Änderung der Signaldisposition und der möglichen Umleitung wird Ihr Prozess im Hintergrund ausgeführt.
Also, was ist der Unterschied?
Ein Hintergrundprozess wird nicht ignoriert SIGHUP
, obwohl Sie Ihrer Shell mitteilen können, dass sie ihn nicht mit Verleugnung senden soll. Wenn nicht verhindert, nohup
leitet stdout zu nohup.out-Dateien um, die ich eher hasse, wenn ich nur nohup.out-Dateien löschen muss, die zufällig auf meiner Festplatte verstreut sind.
Es gibt auch setsid
, was Ihren Prozess zu einem Prozessgruppenleiter macht. Ein Prozessgruppenleiter wird SIGHUP
von keiner Shell an ihn gesendet. setsid
macht nicht viel mit stdout / stderr, und ich neige dazu, setsid
stattdessen zu verwenden nohup
.