Зомбі-процеси в Linux: Знайти, видалити, запобігти

15 хв читання - 19 травня 2026 р.

hero section cover
Зміст
  • Зомбі-процеси в Linux: як їх знайти та видалити
  • Чому зомбі-процеси мають значення на серверах
  • Як знайти зомбі-процеси
  • Як видалити зомбі-процеси
  • Запобігання зомбі-процесам
  • Висновок
Поділитися

Дізнайтеся, як ідентифікувати, видаляти та запобігати зомбі-процесам у Linux. Команди, виправлення коду та поради щодо моніторингу для адміністраторів серверів.

Зомбі-процеси в Linux: як їх знайти та видалити

Зомбі-процес — це дочірній процес, який завершив виконання, але все ще займає місце в таблиці процесів ядра. Він існує, оскільки батьківський процес не викликав wait() для збору його статусу виходу. Зомбі не споживають ресурси процесора чи пам'яті, але кожен з них займає PID. Якщо їх накопичиться достатньо, ваша система не зможе запускати нові процеси. Ця публікація розповідає, як їх виявити, видалити та запобігти їх появі.


 

Чому зомбі-процеси мають значення на серверах

Один зомбі-процес не є небезпечним. Проблема починається, коли їх накопичується багато. Linux має обмежений простір PID: 32 768 на 32-бітних системах, до 4 194 304 на 64-бітних. Якщо зомбі-процеси заповнюють таблицю процесів, ядро не може створювати нові процеси. Це означає, що не буде нових з’єднань, нових робочих потоків, нічого нового.

Веб-сервери, такі як Apache та Nginx, особливо вразливі, оскільки вони запускають дочірні процеси для обробки трафіку. Тести продуктивності показали 48% падіння пропускної здатності, коли зомбі накопичуються на завантаженому веб-сервері. У 2019 році витік каналу Golang у DNS-поді Kubernetes створив понад 26 000 зомбі на одному вузлі, заповнивши таблицю процесів і спричинивши збій розпізнавання DNS у всьому кластері.

У таблиці нижче наведено основні відмінності між звичайним процесом і зомбі:

ХарактеристикаЗвичайний процесЗомбі-процес
Символ стануR, S, D або TZ (неактивний)
Процесор / Пам'ятьАктивне використання0% / 0 (вже завершено)
Запис у таблиці процесівОдин слотОдин слот
Відповідь на kill -9Негайно припиняєтьсяБез ефекту (вже мертвий)
Пам'ять ядраПовний дескриптор процесуТільки мінімальний статус виходу

Головний висновок: ви не можете kill -9 зомбі. Він уже мертвий. Єдиний спосіб очистити його — змусити батьківський процес його прибрати або вбити батьківський процес, щоб init (PID 1) успадкував його та автоматично прибрав.

Як знайти зомбі-процеси

Зомбі відображаються з літерою Z у стовпці STAT та <defunct> поруч із назвою команди. Список їх можна отримати за допомогою:

ps aux | grep -w Z

Щоб побачити ідентифікатор батьківського процесу (PPID), який знадобиться для видалення:

ps -eo pid,ppid,stat,comm | grep -w Z

Команда top команда також повідомляє загальну кількість зомбі у заголовку. Для швидкої неінтерактивної перевірки:

top -bn1 | grep zombie

Відстеження батьківського процесу за допомогою pstree

Отримавши PID зомбі, відстежте його до відповідального батьківського процесу:

pstree -p -s <zombie_pid>

Це показує повне дерево предків init аж до зомбі. Якщо pstree не встановлено, ps auxf надає подібне ASCII-дерево.

Підрахунок зомбі для моніторингу

Чистий підрахунок, що виключає сам процес grep:

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Для безперервного моніторингу під час усунення несправностей:

watch -n 1 'ps aux | grep -w Z | wc -l'

Як видалити зомбі-процеси

Зомбі можна видалити лише шляхом збору їх статусу виходу. Це означає роботу через батьківський процес.

1. Знайдіть батьківський процес.

ps -o ppid= -p <zombie_pid>

2. Подайте сигнал батьківському процесу, щоб він прибрав своїх дочірніх процесів.

kill -SIGCHLD <parent_pid>

Це вказує батьківському процесу викликати wait() для будь-яких завершених дочірніх процесів. Це не порушує роботу системи і працює з добре налагодженими програмами.

3. Якщо SIGCHLD не працює, перезапустіть службу.

systemctl restart <service_name>

4. Якщо батьківський процес не реагує, вбийте його.

kill <parent_pid>

Або якщо він ігнорує SIGTERM:

kill -9 <parent_pid>

Коли батьківський процес завершується, init (PID 1) або systemd прийміть осиротілих зомбі та негайно їх знищіть. Будьте обережні на виробничих системах. Припинення роботи батьківського процесу також припиняє роботу всіх його активних дочірніх процесів.

5. Перевірте очищення.

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Якщо лічильник дорівнює 0, все гаразд.

Запобігання зомбі-процесам

Обробка дочірніх процесів у вашому коді

Основною причиною утворення більшості зомбі-процесів є батьківський процес, який ніколи не викликає wait(). Виправте це у джерелі:

  • C: Встановіть signal(SIGCHLD, SIG_IGN); , щоб автоматично ігнорувати інформацію про завершення дочірніх процесів, або використовуйте обробник сигналів із waitpid(-1, NULL, WNOHANG) для асинхронного прибирання.
  • Python: Використовуйте subprocess.run(), який чекає автоматично. Якщо використовуєте Popen, викличте proc.wait() явно.
  • Bash: Додайте wait в кінці скриптів, що запускають фонові завдання.

Налаштуйте systemd належним чином

Для служб, що керуються systemd, ці налаштування запобігають накопиченню зомбі-процесів:

  • KillMode=control-group гарантує, що всі дочірні процеси будуть завершені одночасно при зупинці служби.
  • TimeoutStopSec дає батьківському процесу час на прибирання дочірніх процесів, перш ніж systemd надішле SIGKILL.
  • WatchdogSec автоматично перезапускає служби, що не відповідають, виявляючи випадки, коли батьківський процес зависає і припиняє очищення.

Моніторинг таблиці процесів

Налаштуйте завдання cron, яке виконується кожні 15 хвилин, щоб підраховувати зомбі та сповіщати, якщо їх кількість перевищує поріг:

ps aux | awk '$8 ~ /Z/' | wc -l

Також стежте за використанням таблиці процесів, порівнюючи поточну кількість з /proc/sys/kernel/pid_max. Якщо він перевищує 80%, проведіть розслідування, перш ніж це стане проблемою. Кілька тимчасових зомбі під час нормальної роботи — це не привід для занепокоєння. Зростаюча кількість, яка не знижується до нуля, вказує на помилку в додатку, яку потрібно виправити.

Висновок

Зомбі-процеси — це мертві діти, які не були очищені. Вони не використовують процесор або пам'ять, але займають PID, а повна таблиця процесів заважає серверу виконувати будь-які корисні дії.

  • Знайдіть їх за допомогою ps aux | grep -w Z та відстежте батьківський процес за допомогою pstree.
  • Видаліть їх, надіславши SIGCHLD батьківському процесу, перезапустивши службу або, в крайньому випадку, завершивши батьківський процес.
  • Запобігайте їх появі, пишучи код, що викликає wait(), правильно налаштовуючи systemd та моніторуючи таблицю процесів.

Якщо ви виконуєте робочі навантаження з високим трафіком і потребуєте надійної інфраструктури з повним доступом до root, виділені сервери FDC надають вам повний контроль над управлінням процесами та конфігурацією системи.

Блог

На цьому тижні

Більше статей
Зомбі-процеси в Linux: Знайти, видалити, запобігти

Зомбі-процеси в Linux: Знайти, видалити, запобігти

Дізнайтеся, як ідентифікувати, видаляти та запобігати зомбі-процесам у Linux. Команди, виправлення коду та поради щодо моніторингу для адміністраторів серверів.

15 хв читання - 19 травня 2026 р.

Контрольний список для зміцнення сервера Linux

15 хв читання - 8 травня 2026 р.

Більше статей
background image

Маєте запитання або потребуєте індивідуального рішення?

icon

Гнучкі варіанти

icon

Глобальне охоплення

icon

Миттєве розгортання

icon

Гнучкі варіанти

icon

Глобальне охоплення

icon

Миттєве розгортання