Зомби (defunct) процессы в Linux

Зомби процессы, что это вообще такое? Без паники, это не опасно, давай разъясню...

Если коротко, то это запись в памяти системы о том, что существует процесс с уникальным id (pid), его текущий статус - завершён, и код (информацию) его завершения должен забрать в виде статуса родительский процесс. По некоторым причинам 🩼 этого не происходит, и процесс остаётся в системе, пока родительский процесс не завершится или не обновит (заберёт) статус дочернего процесса.
Время существования зомби 🧟 процессов неограниченно ♾️

Ищем defunct процессы в системе

ps aux | grep Z
Или сразу с родительским процессом (первый pid процесса defunct, второй pid его родительского процесса)
ps -ao pid,ppid,state | grep Z
Посмотреть команду запуска родительского процесса (ppid подставить из предыдущей команды)
ps -p ppid -ao command

Завершаем работу родительского процесса (если это возможно)

kill ppid # подставить найденный id родительского процесса ppid
Если это не помогает, тогда убиваем родительский процесс
kill -9 ppid # подставить найденный id родительского процесса ppid
⚠️ Будьте осторожны, не все родительские процессы могут быть завершены без аффекта на сервис, требуется убедиться, что он может быть завершён или перезапущен.

Создадим тестовый defunct процесс

Устанавливаем компилятор C
sudo apt install gcc -y
Создаём файл zombie_process.c
nano zombie_process.c
Вставляем простой код на C
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int pid = fork();
if (pid > 0)
sleep(60);
else if (pid == 0)
{
printf("defunct (Z) процесс запущен на 60с.!");
exit(0);
}
}
(Ctrl + o - сохранить, Ctrl + x - выйти)
Создаём исполняемый файл zombie_process
gcc zombie_process.c -o zombie_process
Запускаем defunct (Z) процесс запущен на 60с.
./zombie_process
Подпишись на Linux Spark поддержи канал