nohup
i disown -h
nie są dokładnie tym samym.
Za disown
pomocą proces jest usuwany z listy zadań w bieżącej powłoce interaktywnej. Uruchomienie jobs
po uruchomieniu procesu w tle i uruchomienie disown
nie pokaże tego procesu jako zadania w powłoce. Odrzucone zadanie nie otrzyma HUP
od powłoki po wyjściu (ale patrz uwaga na końcu).
Za pomocą disown -h
, zadanie nie jest usuwane z listy zadań, ale powłoka nie wysyłałaby HUP
do niego sygnału, gdyby się zakończył (ale patrz uwaga na końcu).
nohup
Narzędzie ignoruje HUP
sygnał i zaczyna daną użyteczność. Narzędzie dziedziczy maskę sygnału nohup
i dlatego również zignoruje HUP
sygnał. Kiedy powłoka się kończy, proces pozostaje procesem potomnym nohup
(i nohup
jest ponownie rodzicielski init
).
Różnica polega na tym, że proces rozpoczął się od nohup
ignorowania, HUP
niezależnie od tego, kto wysyła sygnał. W wyparł procesy nie są właśnie wysyłane do HUP
sygnału przez powłokę , ale nadal może być wysłany sygnał z np kill -s HUP <pid>
i nie będzie zignorować.
Zauważ, że HUP
jest wysyłane tylko do zadań powłoki, jeśli
- powłoka jest powłoką logowania i ustawiono
huponexit
opcję powłoki, lub
- sama skorupa odbiera
HUP
sygnał.
Odpowiednie fragmenty bash
instrukcji (moje podkreślenie):
SYGNAŁY
[...]
Powłoka wychodzi domyślnie po otrzymaniuSIGHUP
. Przed wyjściem interaktywna powłoka ponownie wysyła SIGHUP
do wszystkich zadań, uruchomionych lub zatrzymanych. Zatrzymane zadania są wysyłane w SIGCONT
celu zapewnienia, że otrzymają
SIGHUP
. Aby zapobiec wysyłaniu przez powłokę sygnału do określonego zadania, należy ją usunąć z tabeli zadań z disown
wbudowanym (patrz SHELL BUILTIN COMMANDS
poniżej) lub zaznaczyć, że nie można jej SIGHUP
użyć disown -h
.
Jeśli ustawiono huponexit
opcję powłoki shopt
, bash
wysyła a
SIGHUP
do wszystkich zadań po wyjściu z powłoki logowania interaktywnego.
disown [-ar] [-h] [jobspec ... | pid ... ]
Bez opcji usuń każdą jobspec
z tabeli aktywnych zadań. [...] Jeśli -h
podano opcję, każda z nich niejobspec
jest usuwana z tabeli, ale jest oznaczana, aby SIGHUP
nie była wysyłana do zadania, jeśli powłoka otrzyma komunikatSIGHUP
. [...]
Związane z:
nohup
, musisz przekierować stdin / stdout / stderr z dala od TTY (jeśli twoja oryginalna powłoka jest podłączona do jednego). (OTOH, tak naprawdę uważam, że to lepsza praktyka niż poleganie na skandalicznych domyślnych ustawieniach, takich jak./nohup.out
).