Das kaufmännische Und &stellt den Prozess in den Hintergrund. Dateideskriptoren (stdout, stderr, stdin) sind nicht betroffen. Beim Beenden der Shell sendet die Shell SIGHUPan alles, was sie erzeugt hat. Wenn diese Shell geschlossen wird, wird der Hintergrundprozess empfangen SIGHUPund wahrscheinlich beendet. In einigen Shells (bash, zsh) können Sie dies verhindern, indem Sie den Befehl verwenden, disownder die Shell anweist, sie SIGHUPbeim 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, nohupleitet 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 SIGHUPvon keiner Shell an ihn gesendet. setsidmacht nicht viel mit stdout / stderr, und ich neige dazu, setsidstattdessen zu verwenden nohup.