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