Dobre wyjaśnienie różnicy między SIGKILL a SIGTERM (i dlaczego powinieneś najpierw wypróbować SIGTERM)
Wysyłanie sygnałów do procesów wykorzystujących kill w systemie uniksowym nie jest nowym tematem dla większości administratorów systemów, ale wiele razy pytano mnie o różnicę między kill a kill -9.
Za każdym razem, gdy użyjesz zabicia w procesie, faktycznie wysyłasz sygnał do procesu (w prawie wszystkich sytuacjach - zajmę się tym wkrótce). Standardowe aplikacje C mają plik nagłówkowy, który zawiera kroki, które powinien wykonać proces, jeśli otrzyma określony sygnał. Możesz uzyskać całą listę dostępnych sygnałów w swoim systemie, sprawdzając stronę man pod kątem zabicia.
Rozważ takie polecenie:
kill 2563
To wysłałoby do procesu sygnał o nazwie SIGTERM. Gdy proces otrzyma powiadomienie, może się zdarzyć kilka różnych rzeczy:
- proces może zostać natychmiast zatrzymany
- proces może zostać zatrzymany po krótkim czasie po oczyszczeniu zasobów
- proces może działać bez końca
Aplikacja może określić, co chce zrobić po otrzymaniu SIGTERM. Podczas gdy większość aplikacji oczyści zasoby i przestanie działać, niektóre mogą tego nie zrobić. Aplikacja może być skonfigurowana do robienia czegoś zupełnie innego po otrzymaniu SIGTERM. Ponadto, jeśli aplikacja jest w złym stanie, takim jak oczekiwanie na dyskowe operacje we / wy, może nie być w stanie zareagować na wysłany sygnał.
Większość administratorów systemu zwykle ucieka się do bardziej nagłego sygnału, gdy aplikacja nie reaguje na SIGTERM:
kill -9 2563
-9 mówi komendie kill, że chcesz wysłać sygnał # 9, który nazywa się SIGKILL. Przy takiej nazwie oczywiste jest, że ten sygnał ma nieco większą wagę.
Chociaż SIGKILL jest zdefiniowany w tym samym pliku nagłówka sygnału co SIGTERM, proces nie może go zignorować. W rzeczywistości proces nie jest nawet informowany o sygnale SIGKILL, ponieważ sygnał trafia bezpośrednio do inicjacji jądra. W tym momencie init zatrzyma proces. Proces ten nigdy nie ma możliwości uchwycenia sygnału i działania na nim.
Jednak w niektórych sytuacjach jądro może nie być w stanie skutecznie zabić procesu. Jeśli proces czeka na sieciowe lub dyskowe operacje we / wy, jądro nie będzie w stanie go zatrzymać. Procesy zombie i procesy zatrzymane w nieprzerwanym śnie nie mogą być zatrzymane przez jądro. Wymagane jest ponowne uruchomienie komputera, aby usunąć te procesy z systemu.
Gdy wysłałeś killall (SIGTERM) do procesów Thunderbirda, poprosiłeś o zatrzymanie tych procesów. Niektóre z tych procesów nie działały poprawnie (prawdopodobnie dlatego musiałeś je najpierw zabić), więc nie mogły działać na sygnał SIGTERM.