Proces w stanie zakończony to inna nazwa. Jest oczyszczany z pamięci za pomocą procesu nadrzędnego. Gdy proces nadrzędny nie zostanie powiadomiony o zmianie, proces dziecięcy staje się procesem zombie i nie otrzymuje żadnego sygnału zakończenia, aby mógł opuścić pamięć. W Linux, za każdym razem, gdy proces jest usuwany z pamięci, jego proces nadrzędny jest informowany o usunięciu. Proces ten pozostaje w pamięci, dopóki nie powiadomi o procesie nadrzędnym.
Oznacza to, że proces martwy nie jest natychmiast usuwany z pamięci i kontynuuje w pamięci systemowej, stając się w ten sposób procesem zombie. Aby usunąć proces zombie, proces nadrzędny wywołuje funkcję Wait (). Po wezwaniu funkcji Wait () proces zombie jest całkowicie usuwany z systemu.
Zabijanie procesu zombie
Przed przejściem do zabicia procesu zombie najpierw omówimy ryzyko procesu zombie i przyczyny zachodzącego procesu zombie. Dowiemy się również więcej o procesie zombie, aby ułatwić zrozumienie procesu zabijania.
Jaka jest przyczyna procesu zombie
Mogą istnieć dwie główne przyczyny procesu zombie. Pierwszy to ten, w którym proces nadrzędny nie może wywołać funkcji Wait (), gdy działa proces tworzenia dzieci, co prowadzi do ignorowania Sigchld. Może to spowodować proces zombie. Drugi to ten, w którym druga aplikacja może wpłynąć na wykonanie procesu nadrzędnego z powodu złego kodowania lub złośliwej treści.
Innymi słowy, możemy powiedzieć, że proces zombie jest spowodowany, gdy proces nadrzędny ignoruje zmiany stanu procesu dziecka lub nie może sprawdzić stanu procesu dziecka, gdy proces dziecka kończy się PCB.
Czy proces zombie stanowią ryzyko
Proces zombie nie stanowi żadnego ryzyka, po prostu używają części pamięci w systemie. Tabela procesu jest niewielka rozmiar, ale identyfikator tabeli, w którym przechowywany jest proces zombie. Ale w przypadku wielu procesów zombie rezerwujących lokalizację pamięci i nie pozostało miejsca na inne procesy, trudno jest działać inne procesy.
Znalezienie procesu zombie
Przed zabiciem procesu zombie należy je znaleźć. Aby znaleźć proces zombie, uruchomimy następujące polecenie w terminalu:
Linux@Linux-virtualbox: ~ $ ps Aux | egrep „z | defunct”
W powyższym poleceniu „PS” oznacza stan procesu, który jest używany do wyświetlania stanu procesu działającego w systemie wraz z poleceniem PS. Przeszliśmy flagę Aux, w której „A” wskazuje szczegóły wszystkich powiązanych procesów w terminalu, „U” wskazuje procesy znajdujące się na liście użytkowników, a „x” wskazuje procesy, które nie są wykonywane z terminalu. W połączeniu możemy powiedzieć, że służy do drukowania wszystkich działających procesów, które są przechowywane w pamięci.
Druga opcja przekazana „EGREP” to narzędzie przetwarzania, które służy do pobierania wyrażeń lub wzorów w określonej lokalizacji. Na koniec przekazaliśmy słowo kluczowe „Z |. Kiedy wykonamy polecenie, otrzymamy następujące dane wyjściowe, które pokazuje proces zombie w systemie wraz z „PID”.
Wyjście:
Użytkownik PID %CPU %MEM VSZ RSS TTY TTY Stat START TIME Command
Linux 33819 0.0 0.0 18008 724 pkt/0 s+ 20:22 0:00 grep -e -color = automatyczne z |
Procesy zombie są już martwymi procesami, ale proces nadrzędny nie jest w stanie odczytać jego statusu i nie można go zwolnić z pamięci. Zatem nie można zabić martwego procesu. Możemy zrobić tylko dla nich, aby umożliwić procesowi nadrzędnemu odczytanie stanu dziecięcego, aby można go było wykonać i usunąć z tabeli procesu. W tym celu uruchomimy poniższe polecenie.
Linux@Linux -virtualbox: ~ $ ps -o ppid = -p 33819
W powyższym poleceniu próbowaliśmy uzyskać identyfikator nadrzędny procesu zombie. Po uzyskaniu identyfikatora nadrzędnego uruchomiąc następujące polecenie, aby zabić proces zombie, wysyłając sigchld do procesu nadrzędnego, który umożliwia procesowi nadrzędne odczytanie stanu dziecka:
Linux@Linux -virtualbox: ~ $ Kill -s Sigchld Parent_pid
W powyższym poleceniu przekazujemy sygnał do identyfikatora nadrzędnego, aby zabić proces zombie z identyfikatorem nadrzędnego. Po wykonaniu powyższego polecenia po prostu przejdzie do następnego wiersza bez drukowania dowolnego wyjścia na terminalu na wypadek, gdyby nie istniał identyfikator nadrzędny. Aby sprawdzić proces, czy proces zombie zostanie zabity, czy nie, możesz uruchomić polecenie, które już wykonaliśmy, aby znaleźć proces zombie.
Wypróbujmy inny sposób na zabicie procesu zombie, który odbywa się poprzez zabicie samego procesu rodzica. Jest to bardziej wydajny sposób zabicia procesu zombie, ponieważ całkowicie usunie cały proces i nie pozwoli zombie powtórzył się. W tym celu uruchomimy polecenie poniżej Shown:
Linux@Linux -virtualbox: ~ $ KILL -9 Parent_pid
Po uruchomieniu powyższego polecenia pozwalamy systemowi zabić proces nadrzędny.
Wniosek
Krótko omówiliśmy proces zombie, a także przyczyny i procedurę zabijania tych procesów. Przed udaniem się do naszego procesu zabijania próbowaliśmy wyjaśnić przyczyny ich przyczyny, a także sposobów identyfikacji ich za pomocą prostych poleceń.