Halloween w systemie Linux: jak zabić procesy zombie

pieczęć halloween

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.


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: AB Internet Networks 2008 SL
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   zrobił kulki powiedział

    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}')