init никогда не пожинает зомби/несуществующие процессы
-
19-09-2019 - |
Вопрос
На моем веб-сервере Fedora Core 9 с ядром 2.6.18 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>
Это ошибка ОС?неправильная конфигурация?Я ищу вдохновение относительно источника этой проблемы.Спасибо
Решение
Это поразило меня в Ubuntu двумя способами:
Что-то не так с ядром.В моем случае произошел сбой драйвера ядра, и внутренние компоненты процесса сошли с ума.Лучший способ проверить это — проверить /var/log/syslog (и dmesg), чтобы увидеть, не выглядит ли что-то не так – например, «ОШИБКА:невозможно обработать разыменование нулевого указателя ядра по адресу 0000000000000028",
В другой раз я видел это, когда init не является «родителем дочернего процесса для большинства целей» (фактическая цитата из man-страницы).Это может произойти, когда вы используете системный вызов ptrace (который программа strace использует внутри себя) для присоединения к процессу.Например, я попал в ситуацию, когда присоединяю strace к дочернему процессу B.В конце концов, процесс B завершается, как и его родитель (не знаю, в каком порядке).Тогда процесс B выглядит как зомби, принадлежащий init.Однако ее «родителем для большинства целей» на самом деле была программа strace.После уничтожения strace был пожат процесс B