Хеллоуїн у Linux: як перебити зомбі-процеси

Хеллоуїн штамп

День мертвих наближається, і саме тому ми хочемо зробити цей маленький підручник від LxA, щоб поговорити про зомбі-процеси і як ми можемо їх вбити. Перше, що слід сказати, це процес зомбі, і це те, що, як відомо, ядро ​​Linux має підсистему для управління процесами і працює з планувальником для створення, варіювання пріоритету, надсилання або видалення процесора обробки процесора та вбивати процеси. Ну, ця частина ядра, як і решта Unix-подібних систем, розрізняє різні стани процесів ...

Тож ми можемо це знайти процес він може перебувати в сплячому (S) стані, тобто спати. Також процеси в робочому стані (R), які є тими, що наразі запущені або запущені, процеси, що очікують (D), які зупинені в очікуванні на участь, жестикулювання (T) або призупинення, а також зомбі (Z) або померлі. Зомбі або мертвий процес - це вже успішно завершений процес, але певні системні ресурси викрадені, оскільки Linux все ще зберігає його в таблиці процесів. Ви вже знаєте, що коли процес закінчується, він не повинен залишатися в такому стані, а завершується, і ядро ​​звільняє ресурси, щоб інші процеси могли їх використовувати, в основному це звільняє зайняту оперативну пам'ять ...

Ну, оскільки нецікаво мати такий тип процесів зомбі, хоча вони не такі часті, ми можемо шукати та усувати їх, як зазначено тут. Перше, що потрібно знайти, чи є в нашому дистрибутиві зомбі-процеси, і для цього ми можемо допомогти собі самі такі інструменти, як top або like ps. Наприклад, один із цих двох варіантів:

ps -el | grep 'Z'

ps aux | grep defunct

І виявивши, ми можемо вбий його безпосередньо з:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Хоча ще однією альтернативою є пошук батьківських процесів, оскільки вбити процес зомбі Вам доведеться вбити батьківські процеси, які його підтримують, як ви могли зробити висновок:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Вам доведеться замінити за ідентифікатором зомбі-процесу, який ви знайшли, і щоб убити його за допомогою kill, використовуйте ідентифікатор батьківського процесу, який замінює у прикладі, очевидно.


Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: AB Internet Networks 2008 SL
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   робили кульки - сказав він

    Хороший сайт!
    Вони завжди виручають нас із неприємностей.

    Де сказано:
    Хоча іншою альтернативою є пошук батьківських процесів, оскільки, щоб знищити процес зомбі, ви повинні вбити батьківські процеси, які його підтримують, як ви могли зробити висновок:

    1 | ps -eo pid, ppid | grep
    2|
    3 | вбити -9

    Вам доведеться замінити ідентифікатор зомбі-процесу, який ви знайшли, і, очевидно, щоб вбити його за допомогою kill, використовуйте ідентифікатор батьківського процесу, який замінив у прикладі.

    ви можете додати скрипт:

    $cat killppid.sh
    #! / бін / баш
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Звичайно, це не завдання, яке звичайний користувач виконує весь час.
    Це було б корисно лише для адміністратора, але небезпечно запускати його як root, оскільки будь-який процес у системі може бути знищений.

    У вбивстві людини є така нота:

    ПРИМІТКИ Ваша оболонка (інтерпретатор командного рядка) може мати вбудовану команду kill. Ви можете
    потрібно запустити команду, описану тут як / bin / kill, щоб вирішити конфлікт.

    Bash має цю команду, це частина man bash про це:

    kill [-s sigspec | -n знак | -sigspec] [pid | вакансія] ...
    kill -l | -L [sigspec | exit_status]
    Надішліть сигнал із назвою sigspec або signum процесам, названим pid або job
    спец. sigspec - це або ім'я сигналу, не чутливе до регістру, наприклад SIGKILL (з або
    без префікса SIG) або номера сигналу; signum - це сигнальне число. Якщо
    sigspec відсутній, то передбачається SIGTERM. Аргумент -l перераховує
    назви сигналів. Якщо вказано будь-які аргументи, коли вказано -l, імена
    сигнали, що відповідають аргументам, перераховані, а статус повернення дорівнює 0.
    Аргумент exit_status для -l є числом, що вказує номер сигналу або
    статус завершення процесу, завершеного сигналом. Параметр -L еквівалентний
    позичив до -л. kill повертає true, якщо хоча б один сигнал було успішно надіслано, або
    false, якщо виникає помилка або зустрічається недійсний параметр.

    На початку вони пояснюють, як bash захищає процеси, щоб уникнути деяких проблем, але мені незрозуміло, як я міг би створити безпечний скрипт для запуску від імені root.
    Єдине, що я можу придумати, це захистити його таким чином:

    $cat killppid.sh
    #! / бін / баш
    якщо [$ USER == "root"]
    then echo Не запускайте $ 0 як root !!! це небезпечно!
    вихід
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Використовуйте bash kill, а не / bin / kill

    Як ви бачите, що я не дуже добре розбираюся в bash.
    Чи знаєте ви, як написати безпечний сценарій, який запускається як користувач дочірнього процесу, навіть якщо він запускається як root?
    щось еквівалентне тому, що було б зроблено вручну, наприклад:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')