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

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

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


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

Время существования зомби 🧟 процессов неограниченно ♾️


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

ps aux | grep Z

Или сразу с родительским процессом (первый pid процесса defunct, второй pid его родительского процесса)

ps -axo 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


✍️ Подпишись, поддержи канал

Report Page