Что такое зомби-процесс и опасен ли он?

Ответ

Зомби-процесс (или defunct process) — это дочерний процесс в Unix-подобных системах, который завершил своё выполнение, но всё ещё присутствует в таблице процессов операционной системы.

Почему он возникает?

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

Проблема возникает, если родительский процесс не обрабатывает завершение дочернего (не вызывает wait()) и продолжает работать.

Опасность зомби-процессов:

  • Один зомби-процесс практически безвреден. Он не потребляет CPU и занимает очень мало памяти (только запись в таблице процессов).
  • Опасность возникает при их накоплении. Если программа постоянно создает дочерние процессы и не обрабатывает их завершение, таблица процессов может переполниться. Это приведёт к тому, что система не сможет запускать новые процессы.

Пример в Go, который может создать зомби:

package main

import (
    "os/exec"
    "time"
)

func main() {
    cmd := exec.Command("sleep", "1")
    _ = cmd.Start() // Запускаем процесс асинхронно

    // Родительский процесс не ждет завершения дочернего.
    // На 1 секунду процесс sleep станет зомби, пока родитель не завершится.
    time.Sleep(2 * time.Second)
}

Как избежать в Go:

  • Всегда вызывать cmd.Wait() после cmd.Start() для получения результата и освобождения ресурсов.
  • Использовать cmd.Run(), который внутри себя вызывает Start и Wait.