Jak zabić proces w Linuksie?

Jest wiele powodów, dla których czasem jesteś zmuszony ręcznie zabić proces w systemie Linux. W tym artykule skupię się na tym nie dlaczego, ale jak to zrobić prawidłowo. Zatem do dzieła!

W linuksie masz do dyspozycji komendę kill, której zadaniem jest wysłanie sygnału do procesu.

Termination signals

Proces można zabić wysyłając jeden z sygnałów:

Nazwa sygnału Wartość numeryczna Znaczenie
SIGTERM 15 Termination signal (zazwyczaj najlepszy wybór)
SIGKILL 9 Kill signal (używaj tylko w ostateczności)
SIGINT 2 Interrupt from keyboard (ten sygnał jest wysyłany gdy użyjesz Ctrl+C)
SIGHUP 1 Hangup

Dlaczego SIGKILL powinno zostać użyte tylko w ostateczności? Gdy wysyłasz sygnał KILL, to proces nie ma żadnych szans na reakcję i po prostu zostanie "zabity" przes system. Często może się to nie wiązać z żadnymi konsekwencjami, jednak czasami skutki mogą być bardzo dotkliwe t.j. utrata danych.

Z drugiej strony, jeśli użyjesz sygnału TERM to proces będzie miał szansę na nieszkodliwą "śmierć". Czemu tylko będzie miał szansę? Program może zareagować na ten sygnał, ale może go też po prostu zignorować. W takim przypadku proces nie umrze i będziesz go musiał zabić sygnałem KILL, który nie może zostać zignorowany.

Podsumowując, sygnał KILL jest jedynym z sygnałów, który niemal gwarantuje zabicie/zamknięcie procesu. Jednak należy go używać z rozwagą - najlepiej najpierw spróbować sygnału TERM. Efektywności innych sygnałów zależy od tego w jaki sposób konkretny program go obsłuży. W najgorszym razie taki sygnał może zostać całkowicie zignorowany.

Zabijanie procesu

Dobra, znasz już teorię, ale jak to działa w praktyce?

kill -SIGNAL_NAME PID

gdzie SIGNAL_NAME jest jednym z sygnałów a PID jest identyfikatorem procesu.

Przyłady użycia:

kill -SIGHUP 3312
kill -SIGINT 2201
kill -SIGKILL 2611
kill -SIGTERM 2228

Możesz pominąć SIGNAL_NAME - wtedy domyślnie wysyłany jest SIGTERM.

Możesz także użyć skróconej formy - podając wartość numeryczną sygnału (patrz tabelka na górze):

kill -1 3312
kill -2 2201
kill -9 2611
kill -15 2228

Te dwie komendy mają identyczne działanie, ponieważ domyślną wartościa jest SIGTERM:

kill 2228
kill -SIGTERM 2228

Czym jest PID?

Każdy proces w systemie linuks ma przydzielony unikalny numer identyfikujący (PID).

Możesz zobaczyć listę aktualnie działających procesów i ich numery PID:

ps aux

W efekcie otrzymasz (PID znajduje się w drugiej kolumnie):

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  37776  5888 ?        Ss    2017  94:04 /sbin/init
root         2  0.0  0.0      0     0 ?        S     2017   0:02 [kthreadd]
root     10911  0.0  1.0 1127040 352944 ?      Ssl   2017 108:40 mysqld

Oczywiście twoja lista procesów będzie wyglądała zupełnie inaczej niż moja - to jest tylko przykład.

Na podstawie powyższego przykładu, spróbujmy zabić proces mysqld (PID 10911) w sposób delikatny.

kill -SIGTERM 10911

lub

kill -15 10911

Teraz sprawdźmy czy proces zniknął z listy procesów:

ps aux

Wynik:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  37776  5888 ?        Ss    2017  94:04 /sbin/init
root         2  0.0  0.0      0     0 ?        S     2017   0:02 [kthreadd]

Jak widzisz udało nam się zabić proces w delikatny sposób.

Jeśli testujesz podobny scenariusz, a proces nadal znajduje się na liście działających procesów, to poczekaj kilkanaście dodatkowych sekund. Czemu? Prawopodobnie program nie zakończył jeszcze procedury "sprzątania" po sobie.

Jeśli ten stan utrzymuje się zbyt długo, to pozostaje ci tylko jedna opcja. Użyj KILL.

kill -SIGKILL 10911

lub

kill -9 10911

Komenda killall

Gdy chcesz zabić proces możesz także użyć komendy killall zamiast kill. Różnica polega na tym, że w przypadku killall podajesz nazwę programu, a nie PID.

Zatem, żeby zabić na ostro nasz przykładowy proces mysqld:

killall -SIGKILL mysqld

lub

killall -9 mysqld
Autor
Karol Dworakowski
Programista, który odkrył w sobie pasję dzielenia się wiedzą.
Kontakt

Podobał Ci się ten artykuł?

Jeśli tak, to zapisz się do mojego newslettera!
Otrzymasz informacje o najnowszych wpisach, które poszerzą Twoją programistyczną wiedzę i przybliżą Cię do celu.
*Zero spamu, zero sztuczek - Twój adres jest bezpieczny!