Как убить зомби-процессы в Linux

Проще говоря, зомби-процесс — это мертвый процесс, который присутствует в таблице процессов системы. В идеале он должен был быть очищен из таблицы процессов после того, как он завершил свое задание/выполнение, но по какой-то причине его родительский процесс не очистил его должным образом после выполнения.

В мире Linux процесс уведомляет свой родительский процесс после того, как он завершил свое выполнение и вышел. Затем родительский процесс удалит процесс из таблицы процессов. На этом этапе, если родительский процесс не может прочитать статус процесса из своего дочернего (завершенного процесса), он не сможет удалить процесс из памяти, и, таким образом, мертвый процесс все еще продолжает существовать в таблице процессов. — отсюда зомби!

Чтобы убить зомби-процесс, нам нужно сначала идентифицировать его. Для поиска зомби-процессов можно использовать следующую команду:

$ ps aux | egrep "Z|defunct"

Z в столбце STAT и / или [defunct] в последнем столбце (COMMAND) выходных данных будет идентифицировать зомби-процесс.

Теперь практически невозможно убить зомби, потому что он уже мертв! Что можно сделать, так это явным образом уведомить родительский процесс, чтобы он мог повторить попытку чтения состояния дочернего (мертвого) процесса и в конечном итоге очистить их из таблицы процессов. Это можно сделать, отправив сигнал SIGCHLD родительскому процессу. Следующая команда может использоваться для поиска идентификатора родительского процесса (PID):

$ ps -o ppid= <Child PID>

Если у вас есть идентификатор родительского зомби-процесса, вы можете использовать следующую команду для отправки сигнала SIGCHLD родительскому процессу:

$ kill -s SIGCHLD <Parent PID>

Однако, если это не поможет очистить зомби-процесс, вам придется убить или перезапустить его родительский процесс ИЛИ в случае огромного всплеска зомби-процессов, вызывающего или приближающегося к отключению системы, у вас не будет другого выбора, кроме как пойти на перезагрузка системы. Следующая команда может использоваться, чтобы убить его родительский процесс:

$ kill -9 <Parent PID>

Обратите внимание, что завершение родительского процесса повлияет на все его дочерние процессы, поэтому для обеспечения безопасности будет полезна быстрая двойная проверка. В качестве альтернативы, если несколько ложных зомби-процессов не потребляют много ЦП/памяти, лучше убить родительский процесс или перезагрузить систему при следующем плановом обслуживании системы.

Поделитесь с друзьями

Добавить комментарий

2 комментариев
Новіші
Старіші Найпопулярніші
Вбудовані Відгуки
Переглянути всі коментарі
Petro

Використовую вайбер в appimage. Debian Gnome. Закриваю, він в процесах висить.
Хоча на жодному з робочих столів його немає.
Цікаво, у мене статус «в мережі» чи ні? Не знаю.
Тому на всяк випадок вбиваю цього зомбі)

Останнє редагування 2 роки тому від Petro
VINRARUS

О так, цей Linux-костиль вміє доставляти проблеми…

Всі кажуть що зомбі-процеси додаткових ресурсів не займають, окрім місця в таблиці процесів (тобто інформації в /proc/[pid]).

Тому щоб від зомбі-апокаліпсису були помітні проблеми їх повинна бути багатотисячна армія, мені так здається (заtarяна папка /proc/[zombie_pid] займає 220 кБ наприклад).

ПС: щоб убити Адама можна виконати kill -9 1

2
0
Ми любимо ваші думки, будь ласка, прокоментуйте.x