Как убрать зомби-процессы в Linux
Зомби-процессы (zombie processes) в Linux — это процессы, которые завершились, но их родительский процесс не вызвал wait() для очистки их записи в таблице процессов. Они не используют ресурсы процессора или памяти, но могут засорять таблицу процессов, создавая проблемы при большом их количестве.
🔍 1. Поиск зомби-процессов
Используйте одну из следующих команд:
ps aux | awk '$8=="Z" {print $2, $11}'
или
ps -eo pid,ppid,stat,cmd | grep 'Z'
или с использованием top:
- Откройте top и нажмите Z (или посмотрите столбец STAT, где зомби-процессы помечены `Z`).
🛠 2. Удаление зомби-процессов
🔹 2.1. Завершение родительского процесса
Если зомби-процесс еще существует, это значит, что его родитель не вызвал wait(). Определите родительский процесс (PPID):
ps -eo pid,ppid,stat,cmd | grep 'Z'
Завершите его командой:
kill -SIGCHLD <PPID>
Если процесс не реагирует, попробуйте:
kill -9 <PPID>
⚠️ Важно! Убедитесь, что родительский процесс не является критичным для системы.
🔹 2.2. Перезапуск родительского процесса
Если завершение родителя недопустимо, попробуйте его перезапустить:
systemctl restart <service_name>
или
service <service_name> restart
🔹 2.3. Использование init/systemd для "усыновления" процесса
Если родительский процесс невозможно завершить или перезапустить, можно заставить init (PID 1) принять осиротевшие зомби. Это можно сделать, перезапустив родительский процесс, а затем проверив:
ps -eo pid,ppid,stat,cmd | grep 'Z'
🔹 2.4. Перезагрузка системы (как крайний случай)
Если зомби-процессы не исчезают, а их количество растет, можно перезагрузить сервер:
reboot
или для безопасного завершения всех процессов:
shutdown -r now
🔒 3. Предотвращение появления зомби-процессов
1. Используйте обработку дочерних процессов в своих скриптах
Если пишете демоны или фоновые процессы, убедитесь, что ваш код корректно вызывает waitpid().
2. Применяйте обработчики сигналов
В C/C++ можно использовать обработчик SIGCHLD:
signal(SIGCHLD, SIG_IGN);
3. Настройте systemd для автоматического управления процессами
В systemd можно создать службу с KillMode=process в /etc/systemd/system/myservice.service:
[Service]
KillMode=process
4. Контролируйте процессы с помощью ulimit
Установите лимиты на максимальное число процессов:
ulimit -u 100000
👉 @i_odmin