Ich habe eine Antwort von einem Benutzer gelesen, der behauptet, dass sie ausgeführt wird
foo 2>&1 >& output.log &
würde dazu führen foo
, dass die Ausführung auch dann fortgesetzt wird, wenn sie sich abmelden. Laut diesem Benutzer funktionierte dies sogar über SSH-Verbindungen.
Ich habe das nicht wirklich geglaubt, da ich den Eindruck hatte, dass im Falle einer Trennung von SSH oder der Beendigung des TTY die Shell und damit ihre Prozesse ein SIGHUP erhalten würden, wodurch sie beendet würden. Dies unter meiner Annahme, war der einzige Grund für die Verwendung nohup
in solchen Fällen oder tmux
, screen
et al.
Ich habe dann in glibcs Handbuch geschaut :
Dieses Signal wird auch verwendet, um die Beendigung des Steuerungsprozesses auf einem Terminal an Jobs zu melden, die dieser Sitzung zugeordnet sind. Diese Beendigung trennt effektiv alle Prozesse in der Sitzung vom steuernden Terminal.
Dies scheint meine Gedanken zu bestätigen. Aber wenn man weiter schaut, heißt es :
Wenn der Prozess ein Sitzungsleiter ist, der über ein steuerndes Terminal verfügt, wird ein SIGHUP-Signal an jeden Prozess im Vordergrundjob gesendet, und das steuernde Terminal wird von dieser Sitzung getrennt.
Bedeutet dies also, dass Jobs im Hintergrund kein SIGHUP erhalten?
Zu meiner weiteren Verwirrung führte ich eine interaktive Zsh-Sitzung durch, lief yes >& /dev/null &
und tippte exit
, als Zsh mich warnte, dass ich laufende Jobs hatte, und exit
sagte mir nach einem zweiten Tippen , dass es einen Job SIGHUPIERT hatte. Wenn Sie in Bash genau dasselbe tun, läuft der Job…
logout
undyes
läuft noch.Antworten:
Bash scheint das
SIGHUP
nur zu senden, wenn es selbst ein empfangen hatSIGHUP
, was beispielsweise auftritt, wenn ein virtuelles Terminal geschlossen wird oder wenn die SSH-Verbindung unterbrochen wird. Aus der Dokumentation :Wenn Sie also + eingeben
exit
oder drücken , bleibt der gesamte Hintergrundprozess erhalten, da dies kein Auflegesignal an den Bash sendet.CtrlDSie können Bash zwingen, Sie vor der Tatsache zu warnen, dass noch Hintergrundprozesse mit ausgeführt werden
Es besteht die Möglichkeit, den
SIGHUP
On-Exit zu senden, wenn Sie sich in einer interaktiven Shell befinden ( siehe hier ). Aber es funktioniert nicht auf meinem Computer mit Bash 4.2.25. Vielleicht funktioniert es für Siequelle
SIGHUP
wird, andernfalls mit einem sauberen Exit weiterhin Jobs ausgeführt werden? Das erklärt, was ich gesehen habe.huponexit
ist "nur für interaktive Login-Shells