Jak zabijać procesy zombie w systemie Linux
Opublikowany: 2022-01-29Programy, które są źle napisane lub działają źle, mogą pozostawić procesy zombie ukryte w komputerze z systemem Linux. Dowiedz się, jak powstają zombie i jak możesz je w końcu położyć.
Jak działają stany procesów w systemie Linux
Linux musi oczywiście śledzić wszystkie aplikacje i demony działające na twoim komputerze. Jednym ze sposobów, w jaki to robi, jest utrzymywanie tabeli procesów. To jest lista struktur w pamięci jądra. Każdy proces ma wpis na tej liście, który zawiera pewne informacje na jego temat.
Nie ma zbyt wiele w każdej ze struktur tabeli procesów. Zawierają identyfikator procesu, kilka innych elementów danych oraz wskaźnik do bloku sterowania procesem (PCB) dla tego procesu.
Jest to płytka drukowana, która zawiera wiele szczegółów, które Linux musi wyszukać lub ustawić dla każdego procesu. Płytka drukowana jest również aktualizowana w miarę tworzenia procesu, po podaniu czasu przetwarzania i ostatecznie niszczona.
Płytka Linuksa zawiera ponad 95 pól. Jest zdefiniowany jako struktura o nazwie task_struct.h
i ma ponad 700 linii. PCB zawiera następujące rodzaje informacji:
- Stan procesu : Stany są opisane poniżej.
- Numer procesu : jego unikalny identyfikator w systemie operacyjnym.
- Licznik programu : Gdy proces ten otrzyma następnie dostęp do procesora, system użyje tego adresu, aby znaleźć następną instrukcję procesu, która powinna zostać wykonana.
- Rejestry : lista rejestrów procesora używanych przez ten proces. Lista może zawierać akumulatory, rejestry indeksowe i wskaźniki stosu.
- Otwórz listę plików : Pliki powiązane z tym procesem.
- Informacje o planowaniu procesora : używane do określenia, jak często i jak długo czas przetwarzania procesora jest przydzielany temu procesowi. Priorytet procesu, wskaźniki kolejek planowania i inne parametry planowania muszą być zapisane w PCB.
- Informacje o zarządzaniu pamięcią : Szczegóły dotyczące pamięci używanej przez ten proces, takie jak adres początkowy i końcowy pamięci procesu oraz wskaźniki do stron pamięci.
- Informacje o stanie we/wy : wszelkie urządzenia wejściowe lub wyjściowe używane przez proces.
„Stan procesu” może być jednym z następujących:
- R: Działający lub możliwy do uruchomienia proces. Działa, co oznacza, że otrzymuje cykle procesora i wykonuje. Uruchomiony proces jest gotowy do uruchomienia i czeka na gniazdo procesora.
- P. – Proces snu. Proces czeka na zakończenie akcji, takiej jak operacja wejściowa lub wyjściowa, albo na udostępnienie zasobu.
- D: Proces jest w stanie nieprzerwanego snu. Używa blokującego wywołania systemowego i nie może kontynuować, dopóki wywołania systemowe nie zostaną zakończone. W przeciwieństwie do stanu „Sleep”, proces w tym stanie nie będzie odpowiadał na sygnały, dopóki wywołanie systemowe nie zostanie zakończone i wykonanie nie powróci do procesu.
- T: Proces został zakończony (zatrzymany), ponieważ otrzymał sygnał
SIGSTOP
. Odpowiada tylko na sygnałySIGKILL
lubSIGCONT
, które odpowiednio albo zabijają proces, albo nakazują mu kontynuację. Tak się dzieje, gdy przełączasz się z zadań pierwszego planu (fg
) na zadania działające w tle (bg)
. - Z: Proces zombie. Kiedy proces się kończy, nie tylko znika. Zwalnia wszelką używaną pamięć i usuwa się z pamięci, ale jego wpis w tabeli procesów i PCB pozostaje. Jego stan jest ustawiony na
EXIT_ZOMBIE
, a jego proces nadrzędny jest powiadamiany (za pomocą sygnałuSIGCHLD
), że proces potomny został zakończony.
W stanie Zombie proces nadrzędny wywołuje jedną z rodzin funkcji wait()
podczas tworzenia procesu potomnego. Następnie czeka na zmianę stanu w procesie potomnym. Czy proces potomny został zatrzymany, kontynuowany lub zabity przez sygnał? Czy zakończył się poprzez naturalne zakończenie swojego kodu?
Jeśli zmiana stanu jest taka, że proces potomny przestał działać, jego kod zakończenia jest odczytywany. Następnie PCB potomka jest niszczone, a jej wpis w tabeli procesów jest usuwany. Idealnie, wszystko to dzieje się w mgnieniu oka, a procesy w stanie zombie nie trwają zbyt długo.
POWIĄZANE: Jak uruchamiać i kontrolować procesy w tle w systemie Linux
Co powoduje procesy zombie w systemie Linux?
Źle napisany proces nadrzędny może nie wywołać funkcji wait()
podczas tworzenia procesu potomnego. Oznacza to, że nic nie obserwuje zmian stanu w procesie potomnym, a sygnał SIGCHLD
zostanie zignorowany. Lub być może inna aplikacja wpływa na wykonanie procesu nadrzędnego z powodu słabego programowania lub złośliwych zamiarów.
Jeśli jednak proces nadrzędny nie obserwuje zmian stanu w procesie podrzędnym, nie nastąpi prawidłowe porządkowanie systemu. PCB i wpis w tabeli procesów nie zostaną usunięte po zakończeniu procesu potomnego. Powoduje to, że stan zombie nigdy nie jest usuwany z płytki drukowanej.
Zombie używają trochę pamięci, ale zwykle nie stanowią problemu. Wpis w tabeli procesów jest mały, ale dopóki nie zostanie zwolniony, nie można ponownie użyć identyfikatora procesu. W 64-bitowym systemie operacyjnym prawdopodobnie nie spowoduje to żadnych problemów, ponieważ płytka PCB jest znacznie większa niż wpis w tabeli procesów.
Niewykluczone, że ogromna liczba zombie może wpłynąć na ilość wolnej pamięci dla innych procesów. Jeśli jednak masz tyle zombie, masz poważny problem z aplikacją nadrzędną lub błędem systemu operacyjnego.
Jak usunąć procesy zombie?
Nie możesz zabić procesu zombie, ponieważ jest już martwy. Nie będzie odpowiadał na żadne sygnały, ponieważ został usunięty z pamięci — nie ma dokąd wysłać sygnału SIGKILL
. Możesz spróbować wysłać sygnał SIGCHLD
do procesu nadrzędnego, ale jeśli to nie zadziałało po zakończeniu procesu potomnego, jest mało prawdopodobne, aby zadziałało teraz.
Jedynym niezawodnym rozwiązaniem jest zabicie procesu nadrzędnego. Po zakończeniu procesu jego procesy potomne są dziedziczone przez proces init
, który jest pierwszym procesem uruchamianym w systemie Linux (identyfikator procesu to 1).
Proces init
regularnie wykonuje niezbędne czyszczenie zombie, więc aby je zabić, wystarczy zabić proces, który je stworzył. Polecenie na top
to wygodny sposób sprawdzenia, czy masz jakieś zombie.
Wpisz następujące polecenie:
szczyt
Ten system ma osiem procesów zombie. Możemy je wyświetlić, używając polecenia ps
i przesyłając je do egrep
. Znowu procesy zombie mają flagę stanu „Z” i zwykle zobaczysz również „nieistniejący”.
Wpisz następujące polecenie:
ps aux | egrep "Z|nieistniejący"
Wymienione są procesy zombie.
Jest to lepszy sposób na odkrycie identyfikatorów procesów zombie niż przewijanie w przód iw tył w top
. Widzimy również, że aplikacja o nazwie „badprg” zrodziła te zombie.
Identyfikatorem pierwszego zombie jest 7641, ale musimy znaleźć identyfikator procesu nadrzędnego. Możemy to zrobić ponownie używając
. Użyjemy opcji wyjścia ( ps
-o
), aby powiedzieć ps
, aby wyświetlał tylko identyfikator procesu rodzica, a następnie przekazał go z flagą ppid=
.
Proces, który chcemy znaleźć, zostanie wskazany za pomocą opcji -p
(process), a następnie przekazując identyfikator procesu zombie.
Dlatego wpisujemy następujące polecenie, aby wyszukać informacje o procesie dla procesu 7641, ale zgłosi ono tylko identyfikator procesu nadrzędnego:
ps -o ppid= -p 7641
Powiedziano nam, że identyfikator procesu nadrzędnego to 7636. Możemy teraz odnieść się do tego, ponownie używając ps
.
Widzimy, że jest to zgodne z wcześniejszą nazwą procesu nadrzędnego. Aby zabić proces nadrzędny, użyj opcji SIGKILL z poleceniem kill w następujący sposób:
zabić - SIGKILL 7636
W zależności od właściciela procesu nadrzędnego może być konieczne użycie sudo
.
Zombie nie są straszne…
…chyba że są w ogromnej hordzie. Kilka nie ma się czym martwić, a proste ponowne uruchomienie wyczyści je.
Jeśli jednak zauważysz, że aplikacja lub proces zawsze generuje zombie, powinieneś się temu przyjrzeć. Najprawdopodobniej jest to po prostu niechlujnie napisany program, w takim przypadku być może istnieje zaktualizowana wersja, która prawidłowo czyści po swoich procesach potomnych.