disown
powoduje, że powłoka nie wysyła SIGHUP do odrzuconego zadania, gdy powłoka się kończy, oraz
usuwa odrzucone zadanie z kontroli zadań powłoki.
Czy pierwszy jest wynikiem drugiego? Innymi słowy, jeśli proces rozpoczęty od powłoki zostanie w jakikolwiek sposób usunięty z kontroli zadań powłoki, czy powłoka nie wyśle SIGHUP do procesu, gdy powłoka się zakończy?
disown -h
nadal utrzymuje proces pod kontrolą zadania powłoki. Czy to oznacza, disown -h
że proces nadal otrzymuje SIGHUP wysyłane z powłoki, ale ustawia akcję SIGHUP przez proces, aby był „ignorowany”? Brzmi podobnie do nohup
.
$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+ Running sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+ Stopped sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit
$ ps aux | grep sleep
t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 sleep 123
Czy disown -h
i nohup
działaj skutecznie tak samo, jeśli pominiemy ich różnicę w korzystaniu z terminala?
Dzięki.
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
).Odpowiedzi:
nohup
idisown -h
nie są dokładnie tym samym.Za
disown
pomocą proces jest usuwany z listy zadań w bieżącej powłoce interaktywnej. Uruchomieniejobs
po uruchomieniu procesu w tle i uruchomieniedisown
nie pokaże tego procesu jako zadania w powłoce. Odrzucone zadanie nie otrzymaHUP
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łabyHUP
do niego sygnału, gdyby się zakończył (ale patrz uwaga na końcu).nohup
Narzędzie ignorujeHUP
sygnał i zaczyna daną użyteczność. Narzędzie dziedziczy maskę sygnałunohup
i dlatego również zignorujeHUP
sygnał. Kiedy powłoka się kończy, proces pozostaje procesem potomnymnohup
(inohup
jest ponownie rodzicielskiinit
).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 doHUP
sygnału przez powłokę , ale nadal może być wysłany sygnał z npkill -s HUP <pid>
i nie będzie zignorować.Zauważ, że
HUP
jest wysyłane tylko do zadań powłoki, jeślihuponexit
opcję powłoki, lubHUP
sygnał.Odpowiednie fragmenty
bash
instrukcji (moje podkreślenie):Związane z:
źródło
bash: disown: nohup: no such job
samo zasleep
i5
oddisown nohup sleep 5 &
. Co miałeś na myśli przez to drugie polecenie z ostatniego zdania?&
tam (i kolejnośćnohup
idisown
była również błędna). Dzięki. Zaktualizuje się teraz.disown
sprawia, że powłoka nie wysyła SIGHUP do dziecka, usuwając dziecko z listy zadań powłoki. Jak todisown -h
osiągnąć?Oni są różni:
disown usuwa zadanie z tabeli aktywnych zadań. Następnie kontynuuje bieżącą pracę. Z opcją -h proces NIE jest wysyłany ZWIĘKSZENIE. Zamiast tego pozostaje umrzeć wraz ze skorupą, która go zawiera, gdy otrzyma POWIĘKSZENIE.
nohup ignoruje HUP. Następnie wszystko, co zostałoby przekazane do terminala przez zamknięcie procesu, przechodzi do pliku
nohup.out
.źródło