Шукаємо і вбиваємо zombie процеси, виконую установку, настройку, супровід серверів
Що ж це таке?
Це дочірній процес в Unix-системі, який завершив своє виконання, але ще присутній в списку процесів операційної системи, щоб дати батьківського процесу вважати код завершення. Процес при завершенні звільняє всі свої ресурси (за винятком PID - ідентифікатор процесу) і стає «зомбі» - порожній записом в таблиці процесів, що зберігає код завершення для батьківського процесу.
Система повідомляє батьківський процес про завершення дочірнього за допомогою сигналу SIGCHLD. Передбачається, що після отримання SIGCHLD він вважає код повернення за допомогою системного виклику wait (). після чого запис зомбі буде видалена зі списку процесів. Якщо батьківський процес ігнорує SIGCHLD (а він ігнорується за замовчуванням), то зомбі залишаються до його завершення.
А тепер виникають питання: як же все-таки їх знайти і вбити? Знайти їх дуже просто. Ось кілька варіантів:
1)
top | grep zombie
225 processes: 1 running, 222 sleeping, 2 zombie
3)
ps -alx | awk '$ 10
Що стосується «вбивства», то їх не можна просто так убити. Найправильніший варіант - знайти батьківський процес і перезапустити його. Деякі можуть порадити і перевантажитися, але це не вихід.
Знаходимо батьківський процес:
ps ajx | grep -w Z
root 3994 3992 3992 3992 0 Z. 16: 23,02
root 3995 3992 3992 3992 0 Z. 13: 43,28
3-тя колонка якраз і показує pid батьківського процесу. Дивимося, що це за процес:
Власне ми знайшли винуватця. Це exilog_agent. А далі - або просто прибиваємо батьківський процес або перезапускаємо його:
#kill -9 3992
#top | grep zombie
#