Зомбі-процеси в Linux: Знайти, видалити, запобігти
15 хв читання - 19 травня 2026 р.

Дізнайтеся, як ідентифікувати, видаляти та запобігати зомбі-процесам у 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 або T | Z (неактивний) |
| Процесор / Пам'ять | Активне використання | 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. Команди, виправлення коду та поради щодо моніторингу для адміністраторів серверів.
15 хв читання - 19 травня 2026 р.
Контрольний список для зміцнення сервера Linux
15 хв читання - 8 травня 2026 р.

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