nohupund disown -hsind nicht genau dasselbe.
Mit disownwird ein Prozess aus der Liste der Jobs in der aktuellen interaktiven Shell entfernt. Laufen jobsnach einem Hintergrundprozess starten und laufen disownwird als Job in der Schale nicht diesen Prozess zeigen. Ein abgelehnter Job erhält beim Beenden kein HUPvon der Shell (siehe Hinweis am Ende).
Mit disown -hwird der Job nicht aus der Jobliste entfernt, aber die Shell sendet beim Beenden kein HUPSignal (siehe Hinweis am Ende).
Das nohupDienstprogramm ignoriert das HUPSignal und startet das angegebene Dienstprogramm. Das Dienstprogramm erbt die Signalmaske von nohupund ignoriert daher auch das HUPSignal. Wenn die Shell beendet wird, bleibt der Prozess ein untergeordneter Prozess von nohup(und nohupwird übergeordnet init).
Der Unterschied besteht darin, dass der Prozess mit nohupIgnorieren gestartet wird, HUPunabhängig davon, wer das Signal sendet. Die verleugnete Prozesse werden einfach nicht gesendet ein HUPSignal 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 HUPnur dann an die Jobs einer Shell gesendet wird, wenn
- die Shell ist eine Login-Shell und die
huponexitShell-Option ist gesetzt, oder
- Die Shell selbst empfängt ein
HUPSignal.
Relevante Teile aus dem bashHandbuch (mein Schwerpunkt):
SIGNALE
[...]
Die Shell wird standardmäßig mit Erhalt von a beendetSIGHUP . Vor dem Beenden sendet eine interaktive Shell die aktuellen SIGHUPoder angehaltenen Jobs erneut an alle Jobs. Angehaltene Jobs werden gesendet, SIGCONTum sicherzustellen, dass sie die Nachricht erhalten
SIGHUP. Um zu verhindern, dass die Shell das Signal an einen bestimmten Job sendet, sollte dieser mit dem disowneingebauten Befehl (siehe SHELL BUILTIN COMMANDSunten) aus der Jobtabelle entfernt oder als nicht empfangend markiert SIGHUP
werden disown -h.
Wenn die huponexitShell - Option mit gesetzt wurde shopt, bashsendet ein
SIGHUPfür alle Jobs , wenn eine interaktive Login - Shell beendet.
disown [-ar] [-h] [jobspec ... | pid ... ]
Entfernen Sie alle jobspecJobs ohne Optionen aus der Tabelle der aktiven Jobs. [...] Wenn die -hMöglichkeit gegeben wird, die jeweils jobspecwird nicht entfernt von dem Tisch, aber ist markiert , so dass SIGHUPnicht auf den Auftrag gesendet wird , wenn die Schale a erhältSIGHUP . [...]
Verbunden:
nohupstdin / 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).