Jak zabijać procesy z terminala Linux

Zabicie procesu jest czasami jedynym sposobem na pozbycie się go. Pomimo surowej nazwy „zabicie” procesu oznacza po prostu „zmuszenie go do zakończenia”. Oto jak to zrobić z wiersza poleceń systemu Linux lub macOS.

Co to jest proces?

Uruchamianie programów, takich jak przeglądarka internetowa, procesy w tle związane ze środowiskiem graficznym i usługi systemowe Linux to procesy.

Procesy można podzielić na dwie grupy:

Procesy pierwszoplanowe to te, które zostały uruchomione lub uruchomione przez użytkownika. Mogą znajdować się w oknie terminala lub mogą być aplikacjami graficznymi.
Procesy w tle to wszystkie procesy, które są uruchamiane automatycznie i nie mają żadnej interakcji z użytkownikami. Nie oczekują wkładu od użytkowników ani nie przedstawiają im wyników ani wyników. Procesy w tle to takie rzeczy jak usługi i demony.

Jeśli procesy pierwszoplanowe są na froncie pracowników teatru i aktorów, procesy w tle stanowią zespół „za kulisami”.

Gdy procesy działają nieprawidłowo lub nieprawidłowo, mogą zużywać zbyt dużo czasu procesora, zużywać pamięć RAM lub wchodzić w ciasną pętlę obliczeniową i przestać odpowiadać. Aplikacje graficzne mogą odmówić odpowiedzi na kliknięcia myszą. Aplikacje terminala mogą nigdy nie powrócić do wiersza poleceń.

Humanitarna odpowiedź

„Zabijanie” procesu oznacza po prostu „zmuszanie procesu do zakończenia”. Może to być konieczne, jeśli proces odmawia odpowiedzi.

Linux udostępnia polecenia kill, pkill i killall, które pozwalają ci to zrobić. Polecenia te mogą być używane z każdym typem procesu, graficznym lub wierszem poleceń, pierwszym planem lub tłem.

Polecenie zabicia

Aby użyć funkcji kill, musisz znać identyfikator procesu (PID) procesu, który chcesz zakończyć. Do znalezienia PID procesu można użyć polecenia ps.

Aby ps przeszukał wszystkie procesy, użyj opcji -e (wszystkie procesy). Zalecane jest przepuszczanie wyjścia przez mniej, będzie tego całkiem sporo. Wpisz ps, spację, -e, spację, | (pionowa kreska), kolejną spację, a następnie wpisz mniej. Naciśnij klawisz Enter, aby wykonać polecenie.

ps -e | less

ps polecenie w oknie terminala

To da ci listę procesów, która wygląda podobnie do poniższego zrzutu ekranu. Możesz wyszukiwać do przodu w mniej, używając klawisza / i możesz wyszukiwać do tyłu za pomocą? klucz.

wyjście ps w mniejszym oknie

Aby przejść do interesującego Cię procesu, potokuj wyjście z ps do grep i podaj nazwę – lub część nazwy – procesu.

ps -e | grep shutter

komenda ps przesłała polecenie grep, aby znaleźć proces migawki

Po zlokalizowaniu PID procesu, który chcesz zakończyć, przekaż go do komendy kill jako parametr. Aby zakończyć proces rolety zidentyfikowany przez poprzednie polecenie, użyj tego polecenia:

kill 2099

kill polecenie w oknie terminala

Polecenie zabicia to cichy zabójca – nie daje żadnych informacji zwrotnych, jeśli się powiodło.

Polecenie pkill

Polecenie pkill umożliwia zabicie procesu – lub procesów – według nazwy. Nie musisz identyfikować procesu za pomocą PID. Aby użyć pkill, należy podać termin wyszukiwania, którego używa pkill do sprawdzenia listy uruchomionych procesów. Pasujące procesy są przerywane. Musisz więc mieć pewność, że wyszukiwane hasło zostało poprawnie napisane.

Jako sieć bezpieczeństwa możesz użyć polecenia pgrep przed użyciem polecenia pkill. Polecenie pgrep akceptuje również wyszukiwany termin. Wyświetli listę PID każdego procesu, który pasuje do wyszukiwanego terminu. Jest to bezpieczne, ponieważ pgrep nie wyśle ​​żadnego sygnału zabicia do procesów, a jeśli błędnie wpiszesz wyszukiwane hasło, nie zabijesz innego procesu przez pomyłkę. Możesz się upewnić, że wyszukiwane hasło zostało poprawnie przemyślane, zanim przekażesz je do pkill. Zarówno pkill, jak i pgrep traktują wyszukiwane hasło w ten sam sposób. Ich traktowanie jest tak podobne, że oni współużytkować tę samą stronę podręcznika.

Załóżmy, że istnieje proces z „subq” w nazwie. Użyjemy ps -u dave | grep, aby zajrzeć za kurtynę. Możesz zobaczyć, że „subq” będzie pasować do tego procesu i tylko do tego procesu. To było tylko po to, abyś mógł zobaczyć pełną nazwę procesu.

ps -u dave | grep subq

ps polecenie w oknie terminala

Załóżmy, że nasz użytkownik tego nie zrobił; wiedzą tylko, że nazwa procesu zawiera podciąg „subq”. Używają pgrep, aby sprawdzić, czy jest tylko jedno dopasowanie do wyszukiwanego terminu. Następnie używają tego wyszukiwanego hasła z pkill.

pgrep subq
pkill subq

pgrep i pkill w oknie terminala

Możesz użyć pkill, aby zabić kilka procesów naraz. Tutaj użytkownik uruchamia pgrep, aby sprawdzić, ile procesów uruchomiło Chrome. Używają pkill, aby zabić ich wszystkich. Następnie sprawdzają w pgrep, czy wszystkie zostały usunięte.

pgrep chrome
pkill chrome
pgrep chrome

pgrep i pkill w oknie terminala

Jeśli działa kilka procesów o tej samej nazwie, ale nie chcesz ich wszystkich zabijać, możesz użyć pgrep z opcją -f (wiersz poleceń), aby określić, który proces jest którym. Prostym przykładem mogą być dwa procesy ping. Chcesz zabić jednego z nich, a drugiego nie. Możesz użyć ich linii poleceń, aby je rozróżnić. Zwróć uwagę na użycie cudzysłowów do zawijania parametru wiersza polecenia.

pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"

pgrep pkill z wierszem poleceń ping

Polecenie killall

Ostrzeżenie: W systemach operacyjnych Solaris i OpenIndiana komenda killall zabije wszystkie procesy, które należą do Ciebie. Jeśli jesteś rootem lub wydałeś sudo killall, zrestartujesz komputer! Podczas badań do tego artykułu zachowanie to zostało potwierdzone w najnowszej wersji OpenIndiana Hipster 2018.10.

Komenda killall działa w podobny sposób do polecenia pkill, ale z określoną różnicą. Zamiast przekazywać wyszukiwane hasło do polecenia, należy podać dokładną nazwę procesu.

Nie można zapewnić częściowego dopasowania do nazwy procesu; musisz podać całą nazwę procesu, jak pokazano:

killall shutt
killall shutter

killall polecenie w oknie terminala

Opcja -y (młodsza niż) umożliwia zabijanie procesów, które działają krócej niż określony czas. Okres jest podawany liczbowo, po którym następuje jedna z tych jednostek:

s (sekundy)
m (minuty)
h (godziny)
d (dni)
w (tygodnie)
M (miesiące, uwaga, duże „M”)
r (lata)

Aby zabić proces zwany ana, który właśnie został uruchomiony i pozostawić starsze instancje ana uruchomione, możesz użyć następujących parametrów z killall, jeśli zareagujesz w ciągu dwóch minut:

killall -y 2m ana

killall z opcją młodszą niż

Opcja -o (starsza niż) umożliwia zabijanie procesów, które działają dłużej niż określony czas. To polecenie zabije wszystkie połączenia ssh, które były uruchomione dłużej niż jeden dzień:

killall -o 1d sshd

killall polecenie w oknie terminala

Nie bądź zbyt szczęśliwy

Te polecenia pozwolą ci zidentyfikować i zakończyć błędne procesy z dokładnością i bezpieczeństwem.

Zawsze bądź ostrożny. Po pierwsze, upewnij się, że proces, który zamierzasz zabić, jest naprawdę tym, którego chcesz. Po drugie, sprawdź dokładnie – bądź ostrożny i upewnij się, że docelowy proces to ten, który chcesz zakończyć. Kontynuuj kończenie procesu, gdy będziesz zadowolony.