Какой из сигналов (SIGTERM/SIGKILL) может привести к созданию зомби-процесса?

«Какой из сигналов (SIGTERM/SIGKILL) может привести к созданию зомби-процесса?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SIGTERM может привести к появлению зомби-процесса, если родительский процесс не обработает завершение дочернего процесса с помощью системных вызовов wait() или waitpid(). Зомби-процесс — это запись в таблице процессов, которая сохраняется до тех пор, пока родитель не прочитает статус завершения.

SIGKILL (исправлено с SIGSKILL) немедленно завершает процесс, не позволяя ему выполнить обработчики сигналов или корректно освободить ресурсы. Поскольку процесс не может отреагировать на SIGKILL, он не переходит в состояние зомби — ядро напрямую очищает его запись.

Пример на C:

#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // Дочерний процесс завершается
        exit(0);
    } else {
        // Родитель НЕ вызывает wait() — дочерний процесс станет зомби
        sleep(30);
        // После sleep можно увидеть зомби в выводе `ps aux | grep Z`
        // Чтобы избежать зомби, здесь должен быть вызов: wait(NULL);
    }
    return 0;
}

Практика в DevOps: В сценариях оркестрации контейнеров (например, в Kubernetes) или при управлении сервисами через systemd важно правильно обрабатывать сигналы завершения, чтобы избегать накопления зомби-процессов, которые удерживают системные ресурсы (PID).