Nadchodzi dzień śmierci i dlatego chcemy zrobić ten mały samouczek od LxA, aby porozmawiać o procesy zombie i jak możemy ich zabić. Pierwszą rzeczą do powiedzenia jest to, czym jest proces zombie, a to jest to, że jak wiesz, jądro Linuksa ma podsystem do zarządzania procesami i współpracuje z harmonogramem w celu tworzenia, zmiany priorytetu, wysyłania lub usuwania przepływu przetwarzania procesora i zabić procesy. Cóż, ta część jądra, podobnie jak reszta systemów uniksopodobnych, rozróżnia różne stany procesów ...
Więc możemy to znaleźć proces może być w stanie spania (S), to znaczy śpi. Również procesy w stanie uruchomionym (R), czyli te, które są aktualnie uruchomione lub działające, procesy oczekujące (D), które są zatrzymane i oczekują na udział, gestpt (T) lub zawieszone, a także zombie (Z) lub zmarłe. Zombie lub martwy proces to taki, który został już pomyślnie zakończony, ale niektóre zasoby systemowe zostały przejęte, ponieważ Linux nadal zapisuje go w tabeli procesów. Wiesz już, że kiedy proces się kończy, nie powinien pozostać w tym stanie, ale kończy się, a jądro zwalnia zasoby, aby inne procesy mogły z nich korzystać, w zasadzie zwalnia zajmowaną pamięć RAM ...
Cóż, ponieważ posiadanie tego typu procesów zombie nie jest interesujące, chociaż nie są one tak częste, możemy je wyszukiwać i eliminować, jak wskazano tutaj. Pierwszą rzeczą jest sprawdzenie, czy w naszej dystrybucji są procesy zombie i możemy sobie w tym pomóc narzędzia takie jak top lub jak ps. Na przykład jedna z tych dwóch opcji:
ps -el | grep 'Z' ps aux | grep defunct
Po wykryciu możemy Zabij go bezpośrednio z:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
Chociaż inną alternatywą jest znalezienie procesów nadrzędnych, ponieważ do zabić proces zombie Musisz zabić procesy rodzicielskie, które go podtrzymują, jak mogłeś wydedukować:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
Będziesz musiał wymienić przez identyfikator procesu zombie, który znalazłeś i aby go zabić za pomocą kill, użyj identyfikatora procesu nadrzędnego, zastępując w tym przykładzie oczywiście.
Dobra strona!
Zawsze wyciągają nas z kłopotów.
Gdzie mówi:
Chociaż inną alternatywą jest znalezienie procesów nadrzędnych, ponieważ aby zabić proces zombie, musisz zabić wspierające go procesy nadrzędne, jak mogłeś wywnioskować:
1 | ps -eo pid, ppid | grep
2|
3 | zabić -9
Będziesz musiał podstawić ID procesu zombie, który znalazłeś i zabić go za pomocą kill, użyj oczywiście zamieniania ID procesu nadrzędnego w tym przykładzie.
możesz dodać skrypt:
$ kot killppid.sh
#! / bin / bash
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
Oczywiście nie jest to zadanie, które zwykły użytkownik wykonuje cały czas.
Przydałby się tylko administratorowi, ale uruchamianie go jako root jest niebezpieczne, ponieważ może zabić każdy proces w systemie.
W człowieku kill ma następującą notatkę:
UWAGI Twoja powłoka (interpreter wiersza poleceń) może mieć wbudowane polecenie kill. Możesz
musisz uruchomić polecenie opisane tutaj jako /bin / kill, aby rozwiązać konflikt.
Bash ma to polecenie, to jest część człowieka, który się o to bąka:
zabić [-s sigspec | -n znak | -sigspec] [pid | specyfikacja pracy] ...
kill -l | -L [sigspec | stan_wyjścia]
Wyślij sygnał o nazwie sigspec lub signum do procesów o nazwie pid lub job
spec. sigspec to nazwa sygnału niewrażliwa na wielkość liter, taka jak SIGKILL (z lub
bez prefiksu SIG) lub numer sygnału; signum to numer sygnału. Gdyby
brak sigspec, to zakłada się SIGTERM. Argument -l wymienia
nazwy sygnałów. Jeśli podano jakiekolwiek argumenty, gdy podano -l, nazwy
sygnały odpowiadające argumentom są wymienione, a status powrotu wynosi 0.
Argument status_wyjścia do -l jest liczbą określającą numer sygnału lub
status wyjścia procesu zakończonego sygnałem. Opcja -L jest równoważna
pożyczone do -l. kill zwraca prawdę, jeśli przynajmniej jeden sygnał został pomyślnie wysłany, lub
false, jeśli wystąpi błąd lub napotkano nieprawidłową opcję.
Na początku wyjaśniają, w jaki sposób bash chroni procesy, aby uniknąć pewnych problemów, ale nie jest dla mnie jasne, w jaki sposób mógłbym zrobić bezpieczny skrypt do uruchamiania jako root.
Jedyne, o czym mogę pomyśleć, to chronić go w ten sposób:
$ kot killppid.sh
#! / bin / bash
if [$ USER == "root"]
wtedy echo Nie uruchamiaj $0 jako root !!! to jest niebezpieczne!
wyjście
fi
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
$
Użyj zabijania basha, a nie / bin / kill
Jak widzisz, nie znam się zbyt dobrze na bashu.
Czy wiesz, jak napisać bezpieczny skrypt, który działa jako użytkownik procesu potomnego, nawet jeśli działa jako root?
coś równoważnego do tego, co zostałoby zrobione ręcznie w ten sposób:
$ su;
$ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')