Ответ
Зомби-процесс (или 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.