На моем веб-сервере Fedora Core 9 с ядром 2.6.18.8 init не обрабатывает зомби-процессы. Это было бы терпимо, если бы таблица процессов не достигла верхнего предела, при котором новые процессы не могут быть выделены.
Пример вывода ps -el | grep 'Z'
:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 Z 0 2648 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
1 Z 51 2656 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
1 Z 0 2670 1 0 75 0 - 0 exit ? 00:00:02 crond <defunct>
4 Z 0 2874 1 0 82 0 - 0 exit ? 00:00:00 mysqld_safe <defunct>
5 Z 0 28104 1 0 76 0 - 0 exit ? 00:00:00 httpd <defunct>
5 Z 0 28716 1 0 76 0 - 0 exit ? 00:00:06 lfd <defunct>
5 Z 74 10172 1 0 75 0 - 0 exit ? 00:00:00 sshd <defunct>
5 Z 0 11199 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11202 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11205 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11208 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11211 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11240 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11246 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11249 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
5 Z 0 11252 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
1 Z 0 14106 1 0 80 0 - 0 exit ? 00:00:00 anacron <defunct>
5 Z 0 14631 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct>
Это ошибка ОС? неправильная конфигурация? Я ищу вдохновения относительно источника этой проблемы. Спасибо
Когда процесс вызывает системный вызов "exit", он не может быть выполнен полностью. Например, в нем могут быть незавершенные операции ввода-вывода (например, большая запись, которая все еще частично буферизуется в ядре). Когда это происходит, ядро должно завершить все отложенные операции, прежде чем оно сможет завершить системный вызов exit.
Однако, как только процесс вызывает «exit», он больше не работает, и ядро потребует от него как можно больше ресурсов. Таким образом, о нем будет сообщено как о зомби, даже если ядро еще не совсем готово для его использования.
Обычно ядро может выполнить очистку после процесса за доли секунды, системный вызов exit завершится, родительский элемент получит уведомление и процесс будет обработан. Однако это может вызвать проблемы, если процесс зависает от процесса ввода-вывода, который никогда не может быть завершен (например, что может произойти слишком легко с различными комбинациями nfs и ограниченной по времени аутентификацией). Боюсь, что когда это произойдет, ваша единственная альтернатива - перезагрузка.
Если родитель умрет, процесс превратится в зомби. Если это так, то init станет новым родительским элементом для сиротского процесса.
Init будет периодически выполнять wait () и таким образом обрабатывать любые процессы с init в качестве родительского. Это происходит синхронно, то есть он ждет, чтобы обработать каждый процесс индивидуально. Это может время от времени удлинять процесс, если процессы не работают должным образом.
Это может указывать на ошибку в системе, а может и нет. Я предлагаю список рассылки ядра или список рассылки dist, посвященный ядру.
Зомби нельзя пожать с помощью инициализации. Это ответственность родительского процесса, чтобы получить их, вызвав wait * (). Эти процессы оставлены, чтобы родитель мог принимать возвращаемые значения.