Приближается день мертвых, и именно поэтому мы хотим сделать это небольшое руководство от 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 | 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}')