Dlaczego nie miałbym używać „kill -9” / SIGKILL

14

Zadając to pytanie, ponieważ byłem zaskoczony, że nie znalazłem bezpośredniej odpowiedzi; przepraszam, jeśli to duplikat - wyglądałem!

Słyszałem to kill -9lub kill -SIGKILLjest złe, ale nie rozumiem dlaczego. Jeśli nie powinienem, kill -9co powinienem zrobić, aby zabić proces?

dimo414
źródło
2
Przesłanka pytania jest błędna. SIGKILL to tylko narzędzie. Jest zalecany w niektórych sytuacjach i nie jest zalecany w innych sytuacjach (jak wszystkie inne narzędzia).
kubańczyk
@Kubańczyk na pewno, ale jest to często źle zastosowane narzędzie i używane bez zrozumienia jego celu. Widziałem wiele wątków, gdzie A mówi: „ Właśnie kill -9to ” OP mówi „ wielki, że działa! Będę pamiętać, że od teraz! ”, A B jest w ostrzec „ wait kill -9jest niebezpieczne! ” Dopiero po fakcie.
dimo414

Odpowiedzi:

15

SIGKILLwyciąga dywan z uruchomionego procesu, natychmiast go kończąc. W przypadku bardzo prostych programów jest to w porządku; w praktyce jednak istnieje bardzo niewiele „prostych” programów.

Pod przykrywkami nawet trywialnie wyglądające programy wykonują wszelkiego rodzaju transakcje, które muszą wyczyścić przed zakończeniem (pomyśl o finallybloku w Javie i innych językach programowania), takie jak zamykanie uchwytów zasobów, usuwanie plików tymczasowych i opróżnianie danych z pamięć na dysk. Nie można przewidzieć, kiedy program może robić coś takiego.

Jeśli masz szczęście, nie zauważysz niczego złego, jeśli wyślesz wiadomość SIGKILL, ale nie możesz mieć szczęścia na zawsze i możesz nie wiedzieć, że coś poszło nie tak, dopóki nie będzie za późno, aby odzyskać utracone rzeczy.

Prawie nigdy nie powinieneś wysyłać wiadomości SIGKILLi upewnij się, że wyczerpałeś swoje alternatywy, zanim to zrobisz. W wielu przypadkach ponowne uruchomienie (które ostatecznie wyśle SIGKILLs do niewłaściwie działających programów) jest bezpieczniejsze niż ręczne wysłanie SIGKILLsamego siebie. Prawdopodobnie mogę policzyć na palcach jednej ręki, ile razy mam potrzebnych , aby wysłać SIGKILL(i prawdopodobnie wszystkie moje własne życzenie).

Ogólnie rzecz biorąc, możesz użyć Ctrl+ C(który wysyła proces pierwszego planu a SIGINT) lub SIGTERM(jak w „zakończeniu”), aby poinstruować proces, aby przerwał to, co robi i wyjść.

Dalsza lektura:

dimo414
źródło