Tl; dr:
Dlaczego sleepproces może przetrwać, gdy się wyloguję, a terminal jest zamknięty? Moim zdaniem wszystko oprócz demonów i nohupprogramów zostanie zabite podczas wylogowywania. Jeśli sleepmogę przetrwać w ten sposób, czy to oznacza, że mogę użyć tej metody zamiast nohuppolecenia?
O ile bashinstancja spawnowana przez sshnie ma huponexitustawionej opcji, żaden proces nie zostanie w żaden sposób zakończony po wyjściu / wylogowaniu, a gdy huponexitopcja jest ustawiona, użycie kill -9w powłoce nie jest dobrą alternatywą dla użycia nohupw procesach potomnych powłoki; nohupna procesach potomnych powłoki nadal ochroni je przed SIGHUPami, które nie pochodzą z powłoki, i nawet jeśli nie jest to ważne, nohupnadal jest preferowane, ponieważ pozwala na pełne zakończenie działania powłoki.
W bashistnieje opcja o nazwie huponexit, która jeśli zestaw sprawi bashSIGHUP jego dzieci po wyjściu / wylogowania;
W interaktywnych bez logowania bash przypadkach, takich jak na bashprzykład wywoływanych przez gnome-terminalta opcja jest ignorowana; niezależnie od tego, czy huponexitjest bashuzbrojony czy rozbrojony, dzieci nigdy nie zostaną ZWIĘKSZONE bashprzy wyjściu;
W interaktywnych instancjach logowania bash , takich jak bashinstancja spawnowana przez ssh, ta opcja nie jest ignorowana (jednak domyślnie jest rozbrojona); jeśli huponexitjest ustawione, bashdzieci będą PODNIESIANE przez bashprzy wyjściu / wylogowaniu; jeśli huponexitjest rozbrojone, bashdzieci nie będą PODNIESIANE przez bashprzy wyjściu / wylogowaniu;
Ogólnie rzecz biorąc, wychodzenie / wylogowywanie się z interaktywnego bashwystąpienia logowania , chyba że huponexitopcja jest ustawiona, nie spowoduje, że powłoka ZATRZYMUJE swoje potomne, a wyjście / wylogowanie z interaktywnego bashwystąpienia niezalogowanego nie sprawi, że powłoka ZRÓB SIĘ jego potomkami bez względu;
Nie ma to jednak znaczenia w tym przypadku: używanie kill -9 sleepprzetrwa niezależnie, ponieważ zabicie jego procesu nadrzędnego ( bash) nie pozostawi szansy temu drugiemu na zrobienie czegokolwiek z tym pierwszym (tj. Np. Jeśli bieżąca bashinstancja była bashinstancją logowania i ustawiono huponexitopcję, aby ją PODSUMOWAĆ).
Dodatkowo, w przeciwieństwie do innych sygnałów (takich jak wysyłany do SIGNUP sygnał bash), sygnał SIGKILL nigdy nie jest propagowany do procesów potomnych procesu, a zatem sleepnawet nie zostaje zabity;
nohuprozpoczyna proces odporny na sygnały SIGHUP, co jest czymś innym; zapobiegnie zawieszeniu się procesu po odebraniu sygnału SIGHUP, który w tym przypadku mógłby zostać odebrany przez bashinstancję interaktywnego logowania, jeśli huponexitopcja została ustawiona i powłoka została zamknięta; więc technicznie użycie nohupdo uruchomienia procesu w interaktywnej bashinstancji logowania z huponexitwyłączoną opcją zapobiegnie zawieszeniu się procesu po odebraniu sygnału SIGHUP, ale wyjście / wylogowanie z powłoki nie ZNAJDUJE go niezależnie;
Zasadniczo jednak, gdy nohupjest to potrzebne, aby zapobiec nadejściu sygnałów SIGHUP z powłoki nadrzędnej, nie ma powodu, aby preferować kill -9metodę nadrzędną nohupnad metodą podrzędną; zamiast tego powinno być odwrotnie.
Zabicie rodzica za pomocą kill -9metody nie pozostawia rodzicowi wdzięcznego wyjścia, podczas gdy uruchomienie dziecka za pomocą nohupmetody pozwala rodzicowi zostać zakończonym przez inne sygnały, takie jak SIGHUP (na przykład, który ma sens w kontekście dziecka zaczęło używać nohup), co pozwala mu z wdziękiem wyjść.
&rozwinie proces na tło (jak demon) i będzie działał mimo wylogowania.