NBash
Либо создаем зомби через Bash:
(sleep 1 & exec /bin/sleep 7200) &
Выполняем команды и наблюдаем zombie процесс:
ps aux | grep Z
Вывод на экран:
root 1669051 Z 14:09 0:00 [zombie]
Ага, хорошо, зомби завели. Теперь как это дело всё закилить. Простой kill -9 PID не поможет, так как PID родительского процесса будет отличаться от дочернего.
Чтобы найти PID родителя, смотрим:
ps ax | grep zombie
Кто-то грепает по слову defunct, тут уже по потребностям выбирай.
Видим все PIDы и родителя и дочернего:
1669050 S+ 0:00 ./zombie 1669051 Z+ 0:00 [zombie]
В моем случае PID родительского = 1669050, а дочернего 1669051, который собственно и есть зомбик.
Теперь накидываем однострочник:
kill -9 $(ps -A -o stat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
Эта штука найдет все зомби процессы и уничтожит их. Даже не нужно никакие циклы на Bash колхозить.
А если требуется регулярно зачищать зомборей, вешаем однострочник на cron и радуемся.
Вообще это самый простой способ закилить эту каку. Как это сделать через gdb напишу на следующей неделе. Но сразу предупреждают, там оверхед решение и скорее всего оно тебе не понравится. Хотя через gdb можно оставить в живых родительский процесс и убить только дочерних зомбаков.
В большинстве случаев не стоит обращать внимание на этих зомбаков, эти процессы не жрут ресурсы, а являются лишь косяками программного обеспечения.
У меня зомбаки порой случались с nginx на древней CentOS, но после апгрейда на убунту, все прошло.
Если сможешь что-то еще добавить, пиши в комменты, будет всем полезно.
Давай, хороших выходных, не болей!