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