Ответ
Зомби-процесс (состояние Z в ps aux) возникает, когда дочерний процесс завершил свое выполнение (с помощью exit() или получив фатальный сигнал), но его родительский процесс еще не вызвал системный вызов wait() или waitpid() для получения его статуса завершения. Пока родитель не прочитает этот статус, запись о процессе остается в таблице процессов ядра.
Практический пример на Bash:
#!/bin/bash
# Родительский скрипт запускает фоновый процесс и не ждет его завершения
sleep 10 &
echo "Дочерний процесс запущен в фоне, PID: $!"
# Родительский скрипт завершается НЕМЕДЛЕННО, не дожидаясь sleep
exit 0
Если запустить этот скрипт и быстро выполнить ps aux | grep sleep, можно увидеть процесс sleep в состоянии Z (зомби), пока его не "приберет" родитель (обычно init/PID 1).
Ключевые моменты:
- Зомби не потребляют память или CPU: Они лишь занимают запись в таблице процессов. Проблема возникает, если таких записей становится слишком много (лимит
pid_max). - Уборка зомби: Если родительский процесс завершается, его зомби-потомки усыновляются процессом
init(с PID 1), который периодически вызываетwait()для их очистки. - Отладка: Для поиска зомби-процессов используйте
ps aux | awk '$8=="Z" {print $0}'. Чтобы избежать их появления в своих программах, необходимо корректно обрабатывать сигналSIGCHLDили использоватьwait()в родительском процессе.