Хэллоуин в Linux: как убить зомби-процессы

марка на хэллоуин

Приближается день мертвых, и именно поэтому мы хотим сделать это небольшое руководство от LxA, чтобы поговорить о зомби-процессы и как мы можем их убить. Первое, что нужно сказать, это что такое зомби-процесс, а именно то, что, как вы знаете, ядро ​​Linux имеет подсистему для управления процессами и работает с планировщиком для создания, изменения приоритета, отправки или удаления потока обработки ЦП и убить процессы. Ну, эта часть ядра, как и другие Unix-подобные системы, различает различные состояния процессов ...

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

Что ж, поскольку этот тип зомби-процессов неинтересен, хотя они не так часты, мы можем искать и устранять их, как указано здесь. Первым делом нужно выяснить, есть ли в нашем дистрибутиве зомби-процессы, и для этого мы можем помочь себе. такие инструменты, как top или 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, очевидно, используя идентификатор родительского процесса, подставив его в пример.

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

    $ кот killppid.sh
    #! / Bin / Баш
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Конечно, это не та задача, которую обычный пользователь выполняет все время.
    Это было бы полезно только для администратора, но запускать его как root опасно, потому что любой процесс в системе может быть убит.

    В man kill есть такая заметка:

    ПРИМЕЧАНИЯ Ваша оболочка (интерпретатор командной строки) может иметь встроенную команду kill. Вы можете
    необходимо выполнить команду, описанную здесь как / bin / kill, чтобы разрешить конфликт.

    У Bash есть эта команда, это часть man bash по этому поводу:

    kill [-s sigspec | -n signum | -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 эквивалентен
    одолжил -l. kill возвращает истину, если хотя бы один сигнал был успешно отправлен, или
    false, если произошла ошибка или обнаружен недопустимый параметр.

    Вначале они объясняют, как bash защищает процессы, чтобы избежать некоторых проблем, но мне непонятно, как я могу сделать безопасный сценарий для запуска от имени пользователя root.
    Единственное, что я могу придумать, это защитить его вот так:

    $ кот killppid.sh
    #! / Bin / Баш
    если [$ USER == "root"]
    затем echo Не запускайте $ 0 от имени root !!! это опасно!
    выход
    fi

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

    $

    Используйте kill bash, а не / bin / kill

    Как вы видите, я не очень хорошо разбираюсь в bash.
    Вы знаете, как написать безопасный сценарий, который запускается от имени пользователя дочернего процесса, даже если он запускается от имени пользователя root?
    что-то эквивалентное тому, что было бы сделано вручную вот так:

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