(ОС: вариант Debian.)
Имея процесс со статусом зомби. PPid
Принадлежал к gvim
процессу. Содержимое /proc/[pid]/wchan
являетсяdo_exit
,
/comm
есть sh
и /cmdline
пусто, /status
показано ниже.
Может ли это быть ошибкой в gvim
? Из статьи в ВикипедииПроцесс зомбиЯ читал, что программа может добровольно отказаться от вызова, wait
но это было для
gvim
сеанса, который был бездействующим в течение довольно долгого времени. Я закрыл процесс gvim
– но зомби все еще таится поблизости. Может ли это указывать на ошибку ОС?
Опять же из Википедии:
Если родительская программа больше не запущена, зомби-процессы обычно указывают на ошибку в операционной системе.
И как часто init
reap оставил процессы? Прошло не менее 60 минут с момента gvim
кончины , но он все еще там.
С другой стороны, может ли быть sh
и нет gvim
?
The/status
файлсостояния SigQ
нуля.
$ less /proc/30339/status
Name : sh
State : Z (zombie)
Tgid : 30339
Pid : 30339
PPid : 29673
TracerPid: 0
Uid : 1000 1000 1000 1000
Gid : 1000 1000 1000 1000
FDSize : 0
Groups : 4 7 20 24 27 29 30 46 107 124 127 1000
Threads : 1
SigQ : 0/30658
SigPnd : 0000000000000000
ShdPnd : 0000000000000000
SigBlk : 0000000000000000
SigIgn : 0000000000003001
SigCgt : 0000000000010002
CapInh : 0000000000000000
CapPrm : 0000000000000000
CapEff : 0000000000000000
CapBnd : ffffffffffffffff
Cpus_allowed : 3
Cpus_allowed_list: 0-1
Mems_allowed : 1
Mems_allowed_list: 0
voluntary_ctxt_switches : 2
nonvoluntary_ctxt_switches: 3
Не то чтобы это нарушало мой сон, но вот интересно…
решение1
Появление зомби, как правило, указывает на ошибку в процессе, который их породил: этот процесс должен уничтожить зомби (вызвав wait
) или явно проигнорировать SIGCLD
(или установить SA_NOCLDWAIT
флаг).
Однако это незначительная ошибка. Процессы-зомби потребляют только запись в таблице процессов, что является незначительным объемом ресурсов. Проблема становится существенной только в том случае, если процесс оставляет после себя тысячи зомби.
Вы не убили родительский процесс зомби: иначе зомби бы исчез. Процесс 29673 (родитель зомби) все еще жив и здоров (но не wait
ing). Либо это не Gvim, а какой-то его подпроцесс, либо вы закрыли окно Gvim, но программа все еще работает. Запустите, ps l 29673
чтобы узнать, что это за процесс.
решение2
Если вы постоянно сталкиваетесь с процессом-зомби, я склонен думать, что определенно что-то не так. Процессы-зомби случаются. Обычно я вижу несколько в месяц на различных системах, которые я обслуживаю как на работе, так и дома.
Обычно их можно объяснить ошибкой оператора или проблемой с определенным программным обеспечением. Перезагрузка обычно решает их, и они обычно не повторяются в течение некоторого времени.
Если они вас беспокоят, вы можете попробовать подключиться к идентификатору их родительского процесса (PPID), gdb
чтобы узнать, что происходит, или даже попытаться завершить их:
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
Если вы готовы, я бы рекомендовал вам ознакомиться с дополнительными ресурсами, представленными ниже, чтобы узнать о других методах борьбы с ними.
Рекомендации
решение3
Это происходит каждый раз, когда вы используете gvim? Работает ли gvim, кроме как оставляет зомби после выхода? Если это не вызывает реальных проблем, я бы просто проигнорировал это — зомби не нагружают системные ресурсы. Я бы не удивился, если бы это была ошибка в gvim — или, возможно, в gtk, но если программа вообще не работает, я бы проигнорировал это.
Процесс зомби/умерший обычно происходит, когда дочерний процесс завершается до того, как родительский процесс начинает его прослушивать. Дочерний процесс "остается", потому что не было программы, которая могла бы получить его статус выхода, даже если он успешно завершился - поэтому он становится зомби. Другая причина, по которой вы получаете зомби, может заключаться в том, что большое дерево процессов рушится - возможно, потому что кто-то пытался завершить один или несколько процессов в дереве.
Зомби — это на самом деле способ для ОС сохранить статус выхода и другую информацию о процессе, который не был завершен достаточно корректно, на случай, если кому-то интересно. Помимо записи в таблице процессов, зомби не занимает никаких ресурсов (т. е. памяти или процессора).
IMHO WikiPedia ошибается — или, по крайней мере, ее легко неправильно понять, — когда утверждает, что неубранные зомби означают ошибку ОС, если они задерживаются после того, как основной процесс, который он породил, завершается. Нередко зомби выживает после своих родителей, в этом случае он усыновляется init
(PID 1). init
может в конечном итоге пожать его, но некоторые зомби — даже те, которые усыновлены init — вполне могут оставаться до перезагрузки. Пока у вас не так много зомби, что они заполняют таблицу процессов, они вряд ли представляют собой проблему.
Конечно, зомби часто означают, что что-то не так - программа порождает дочернюю, которая умирает до того, как ожидает родительская - но проблема не обязательно в ОС. Конечно, причиной могут быть компоненты ОС - например, отсутствующий или неправильно настроенный звуковой сервер заставляет дочерние процессы, которые должны обрабатывать звук для программы, немедленно завершаться, таким образом оставаясь в виде зомби.
решение4
Как всегда - смотря по обстоятельствам. Большинство инструментов мониторинга становятся желтыми или красными, если они обнаруживают больше определенного количества зомби-процессов.
Так что в принципе да, это обычно признак проблемы.
Но я видел программы, которые порождали зомби-процессы как часть своих "нормальных" операций. Эти зомби-процессы исчезали, когда соответствующий top-level-api (я не говорю родительский процесс здесь) вызывался командой "quit/exit".
Так что в этих случаях, похоже, приложение позаботилось (и, возможно, нуждалось) об этих зомби. Поэтому для мониторинга мне пришлось определить исключение на серверах, где эти приложения были запущены.
В других случаях зомби исчезали через короткое время, поэтому у вас могут быть определенные непостоянные состояния системы с зомби-процессами.
В вашем случае: если gvim
все сделано, то зомби не должно остаться — так что, вероятно, это ошибка.