Что такое зомби-процесс и что может быть его причиной?

Зомби в операционных системах UNIX называют завершившиеся процессы, код завершения которых не забрал родительский процесс. Зомби не потребляют никаких ресурсов, память и файловые дескрипторы таких процессов уже освобождены. Остается только запись в таблице процессов, которая занимает несколько десятков байт памяти. Так что единичный зомби процесс на систему почти никак не влияет. Однако таблица процессов является конечным ресурсом, и ее может заполнить чрезмерное количество зомби, что означает, что никакие другие процессы не могут быть запущены. Кроме того, это явный индикатор того, что у какого то процесса в системе что то пошло не так.

Поиск зомби: ps -axho state,pid,ppid | grep Z | sed 's/./ps/' | sh

Данная команда покажет все зомби процессы и их родителей.

Если родительский процесс использует wait, но зомби все равно появляются то нужно смотреть какая разновидность wait используется, если waitpid, которая проверяет завершение конкретных потомков, то смотреть откуда она берет проверяемые pid, возможно в процессе работы какие то pid потомков теряются и программа про них забывает. Может программа в какой то момент запрещает обработку сигналов и забывает восстановить обработку, после прохождения критического участка. Вариантов очень много, но сосредоточены они вокруг обработчика SIGCHLD и функций wait.

Если родительский процесс умеет обрабатывать и готов правильно обработать завершение своих потомков. Но зацикливается в другом месте программы или засыпает на системном вызове, например чтения с сетевого диска, который стал недоступен и при этом прерывание по SIGCHLD запрещено. В этом случае надо разбираться с причинами его зависания. Кстати, отсутствие доступа к каким либо ресурсам, типа сетевых дисков (или при выходе из строя физического диска) — довольно частая причина массового появления зомби.

Убить зомби можно уничтожением родительского процесса. Уничтожение родительского процесса приведет к тому, что дочерние процессы, которые были зомби, станут сиротами и будут удочерены/усыновлены процессом init 1, и теперь уже процесс init будет циклически wait() для завершенных дочерних процессов.

Каких либо специальных логов в системе, где можно было бы увидеть хоть какую то информацию по появляющимся зомби не существует. Следы можно найти только в логах той программы, которая их порождает, при их наличии.