nohupi disown -hnie są dokładnie tym samym.
Za disownpomocą proces jest usuwany z listy zadań w bieżącej powłoce interaktywnej. Uruchomienie jobspo uruchomieniu procesu w tle i uruchomienie disownnie pokaże tego procesu jako zadania w powłoce. Odrzucone zadanie nie otrzyma HUPod 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 HUPdo niego sygnału, gdyby się zakończył (ale patrz uwaga na końcu).
nohupNarzędzie ignoruje HUPsygnał i zaczyna daną użyteczność. Narzędzie dziedziczy maskę sygnału nohupi dlatego również zignoruje HUPsygnał. Kiedy powłoka się kończy, proces pozostaje procesem potomnym nohup(i nohupjest ponownie rodzicielski init).
Różnica polega na tym, że proces rozpoczął się od nohupignorowania, HUPniezależnie od tego, kto wysyła sygnał. W wyparł procesy nie są właśnie wysyłane do HUPsygnał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 HUPjest wysyłane tylko do zadań powłoki, jeśli
- powłoka jest powłoką logowania i ustawiono
huponexitopcję powłoki, lub
- sama skorupa odbiera
HUPsygnał.
Odpowiednie fragmenty bashinstrukcji (moje podkreślenie):
SYGNAŁY
[...]
Powłoka wychodzi domyślnie po otrzymaniuSIGHUP . Przed wyjściem interaktywna powłoka ponownie wysyła SIGHUPdo wszystkich zadań, uruchomionych lub zatrzymanych. Zatrzymane zadania są wysyłane w SIGCONTcelu 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 disownwbudowanym (patrz SHELL BUILTIN COMMANDSponiżej) lub zaznaczyć, że nie można jej SIGHUP
użyć disown -h.
Jeśli ustawiono huponexitopcję powłoki shopt, bashwysyła a
SIGHUPdo wszystkich zadań po wyjściu z powłoki logowania interaktywnego.
disown [-ar] [-h] [jobspec ... | pid ... ]
Bez opcji usuń każdą jobspecz tabeli aktywnych zadań. [...] Jeśli -hpodano opcję, każda z nich niejobspec jest usuwana z tabeli, ale jest oznaczana, aby SIGHUPnie 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).