nohup
und disown -h
sind nicht genau dasselbe.
Mit disown
wird ein Prozess aus der Liste der Jobs in der aktuellen interaktiven Shell entfernt. Laufen jobs
nach einem Hintergrundprozess starten und laufen disown
wird als Job in der Schale nicht diesen Prozess zeigen. Ein abgelehnter Job erhält beim Beenden kein HUP
von der Shell (siehe Hinweis am Ende).
Mit disown -h
wird der Job nicht aus der Jobliste entfernt, aber die Shell sendet beim Beenden kein HUP
Signal (siehe Hinweis am Ende).
Das nohup
Dienstprogramm ignoriert das HUP
Signal und startet das angegebene Dienstprogramm. Das Dienstprogramm erbt die Signalmaske von nohup
und ignoriert daher auch das HUP
Signal. Wenn die Shell beendet wird, bleibt der Prozess ein untergeordneter Prozess von nohup
(und nohup
wird übergeordnet init
).
Der Unterschied besteht darin, dass der Prozess mit nohup
Ignorieren gestartet wird, HUP
unabhängig davon, wer das Signal sendet. Die verleugnete Prozesse werden einfach nicht gesendet ein HUP
Signal von der Schale , kann aber immer noch das Signal von zB gesendet werden kill -s HUP <pid>
und wird dies nicht ignorieren.
Beachten Sie, dass HUP
nur dann an die Jobs einer Shell gesendet wird, wenn
- die Shell ist eine Login-Shell und die
huponexit
Shell-Option ist gesetzt, oder
- Die Shell selbst empfängt ein
HUP
Signal.
Relevante Teile aus dem bash
Handbuch (mein Schwerpunkt):
SIGNALE
[...]
Die Shell wird standardmäßig mit Erhalt von a beendetSIGHUP
. Vor dem Beenden sendet eine interaktive Shell die aktuellen SIGHUP
oder angehaltenen Jobs erneut an alle Jobs. Angehaltene Jobs werden gesendet, SIGCONT
um sicherzustellen, dass sie die Nachricht erhalten
SIGHUP
. Um zu verhindern, dass die Shell das Signal an einen bestimmten Job sendet, sollte dieser mit dem disown
eingebauten Befehl (siehe SHELL BUILTIN COMMANDS
unten) aus der Jobtabelle entfernt oder als nicht empfangend markiert SIGHUP
werden disown -h
.
Wenn die huponexit
Shell - Option mit gesetzt wurde shopt
, bash
sendet ein
SIGHUP
für alle Jobs , wenn eine interaktive Login - Shell beendet.
disown [-ar] [-h] [jobspec ... | pid ... ]
Entfernen Sie alle jobspec
Jobs ohne Optionen aus der Tabelle der aktiven Jobs. [...] Wenn die -h
Möglichkeit gegeben wird, die jeweils jobspec
wird nicht entfernt von dem Tisch, aber ist markiert , so dass SIGHUP
nicht auf den Auftrag gesendet wird , wenn die Schale a erhältSIGHUP
. [...]
Verbunden:
nohup
stdin / stdout / stderr (falls Ihre ursprüngliche Shell mit einer solchen verbunden ist) selbst umleiten müssen , wenn Sie sie nicht verwenden . (OTOH, ich halte das eigentlich für eine bessere Übung, als mich auf einen ungeheuren, hartkodierten Standard zu verlassen, wie./nohup.out
).