Как завершить зомби-процесс в Linux

«Как завершить зомби-процесс в Linux» — вопрос из категории Linux, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Зомби-процесс (статус Z) — это уже завершённый процесс, чей родитель не вызвал wait() для чтения его статуса выхода. Сам зомби-процесс не потребляет ресурсы CPU, но занимает запись в таблице процессов.

Как я нахожу зомби:

ps aux | grep 'Z'
# Или с деталями:
ps -eo pid,ppid,state,cmd | grep -E '^.* Z'

Способы устранения:

  1. Завершить родительский процесс — самый прямой метод:
    
    # Найти PPID зомби
    ps -o ppid= -p <ZOMBIE_PID>

Отправить SIGTERM, затем SIGKILL если нужно

kill kill -9

После этого `init` (PID 1) унаследует зомби и вызовет `wait()`.

2. **Отправить родителю SIGCHLD**, если он его обрабатывает:
```bash
kill -SIGCHLD <PARENT_PID>
  1. Исправить код приложения — если я разработчик родительского процесса:
    
    // В родительском процессе:
    signal(SIGCHLD, SIG_IGN);  // Простой способ, но не всегда подходит

// Или правильная обработка: void sigchld_handler(int sig) { while (waitpid(-1, NULL, WNOHANG) > 0); } // ... signal(SIGCHLD, sigchld_handler);



**В продакшн-среде** я сначала анализирую, почему появились зомби:
- Проверяю логи родительского процесса
- Смотрю метрики (например, в Prometheus) на предмет утечек процессов
- Если это контейнер — проверяю, корректно ли обрабатываются сигналы в entrypoint
- Для Kubernetes подов настраиваю `shareProcessNamespace: true` для отладки

Зомби обычно указывают на баг в приложении, который нужно исправить, а не просто "убить".