Ответ
Зомби-процесс (статус Z) — это уже завершённый процесс, чей родитель не вызвал wait() для чтения его статуса выхода. Сам зомби-процесс не потребляет ресурсы CPU, но занимает запись в таблице процессов.
Как я нахожу зомби:
ps aux | grep 'Z'
# Или с деталями:
ps -eo pid,ppid,state,cmd | grep -E '^.* Z'
Способы устранения:
- Завершить родительский процесс — самый прямой метод:
# Найти PPID зомби ps -o ppid= -p <ZOMBIE_PID>
Отправить SIGTERM, затем SIGKILL если нужно
kill
После этого `init` (PID 1) унаследует зомби и вызовет `wait()`.
2. **Отправить родителю SIGCHLD**, если он его обрабатывает:
```bash
kill -SIGCHLD <PARENT_PID>
- Исправить код приложения — если я разработчик родительского процесса:
// В родительском процессе: signal(SIGCHLD, SIG_IGN); // Простой способ, но не всегда подходит
// Или правильная обработка: void sigchld_handler(int sig) { while (waitpid(-1, NULL, WNOHANG) > 0); } // ... signal(SIGCHLD, sigchld_handler);
**В продакшн-среде** я сначала анализирую, почему появились зомби:
- Проверяю логи родительского процесса
- Смотрю метрики (например, в Prometheus) на предмет утечек процессов
- Если это контейнер — проверяю, корректно ли обрабатываются сигналы в entrypoint
- Для Kubernetes подов настраиваю `shareProcessNamespace: true` для отладки
Зомби обычно указывают на баг в приложении, который нужно исправить, а не просто "убить".