Różnica między mniej gwałtownym sygnałem zabicia -HUP (1) -INT (2) i -TERM (15)

32

Oprócz najbardziej gwałtownych kill -9(SIGKILL), nie do końca rozumiem różnicę między 3 innymi powszechnymi sygnałami ( tutaj ) -HUP(1), -INT(2) i -TERM(15).

W jakich scenariuszach jeden działałby, a drugi nie?

Ogólnie kiedy -9( -KILL) zawodzi?

Wydaje mi się, że proszą ten proces, aby zakończył się z gracją , bez oszczędzania . Oceniając surowość, powiedziałbym -HUP < -TERM < -INT < -KILL.

Kenny
źródło
HUPniekoniecznie oznacza, że ​​program zostanie zamknięty. Niektóre programy używają SIGHUPdo przeładowywania plików konfiguracyjnych. SIGKILLkończy się niepowodzeniem, a raczej zostaje przełożone, gdy proces znajduje się w nieprzerwanym śnie .
muru

Odpowiedzi:

52

SIGKILL nigdy nie zabija uruchomionego procesu, o to właśnie chodzi. Istnieją inne sygnały, które dają aplikacji szansę na reakcję.

Domyślne zachowanie SIGINT, SIGTERM, SIGQUIT i SIGHUP to zabicie programu. Jednak aplikacje mogą instalować moduł obsługi tych sygnałów. Tak więc faktyczne zachowanie aplikacji po otrzymaniu tych sygnałów jest kwestią konwencji (do której każda aplikacja może się stosować lub nie), a nie projektu systemu.

SIGINT jest „najsłabszym” ze wszystkich. Jego konwencjonalne znaczenie to „przestań robić to, co teraz robisz i czekaj na dalsze informacje od użytkowników”. Jest to sygnał generowany przez Ctrl+ Cw terminalu. Programy nieinteraktywne ogólnie traktują to jak SIGTERM.

SIGTERM to „normalny” sygnał zabicia. Mówi aplikacji, aby zakończyła się czysto. Aplikacja może potrzebować czasu, aby zapisać swój stan, aby zwolnić zasoby, takie jak pliki tymczasowe, które w przeciwnym razie pozostałyby w tyle, itp. Aplikacja, która nie chce być przerywana podczas krytycznej aplikacji, może na chwilę zignorować SIGTERM.

SIGHUP jest mniej więcej taki sam jak SIGTERM pod względem szorstkości, ale ma określoną rolę, ponieważ jest automatycznie wysyłany do aplikacji działających w terminalu, gdy użytkownik rozłącza się z tym terminalem (etymologicznie, ponieważ użytkownik łączył się przez linię telefoniczną i modem rozłączyć się). SIGHUP jest często mimowolny, w przeciwieństwie do SIGTERM, który musi być wysyłany jawnie, więc aplikacje powinny próbować zapisać swój stan na SIGHUP. SIGHUP ma również zupełnie inne konwencjonalne znaczenie dla aplikacji nieprzeznaczonych dla użytkownika ( demony ), czyli do ponownego ładowania pliku konfiguracyjnego.

SIGQUIT to najostrzejszy z możliwych do zapamiętania sygnałów. Jest przeznaczony do użycia, gdy aplikacja działa nieprawidłowo i musi zostać teraz zabita, i domyślnie pozostawił plik zrzutu pamięci (nowoczesne systemy, w których większość użytkowników nie wiedziałaby, jaki plik podstawowy zwykle nie tworzy) . Aplikacje mogą ustawić moduł obsługi, ale powinny robić bardzo niewiele (w szczególności nie zapisywać żadnego stanu), ponieważ intencją SIGQUIT jest użycie, gdy coś jest naprawdę nie tak.

Gilles „SO- przestań być zły”
źródło
Czy możesz opracować więcej informacji na temat „zapisz ich stan”? Jeśli korzystam z edytora tekstu i zabijam go, przypuszczam, że treść nie została zapisana.
Kenny,
2
@Kenny Większość redaktorów nie zapisuje pliku, ponieważ być może dokonałeś tymczasowych modyfikacji, których nie zamierzałeś zapisać. Zaawansowane edytory (np. Vi, emacs) mają plik automatycznego zapisywania, w którym od czasu do czasu zapisują dane; podczas SIGHUP zwykle upewniają się, że plik automatycznego zapisywania jest aktualny.
Gilles „SO- przestań być zły”