У меня есть раздражающий процесс зомби, который принимается init, и он не пройдет. Я читал, что есть способ создать фиктивный процесс, прикрепить зомби как дочерний элемент этого нового процесса, а затем убить его, удалив из таблицы процессов.
Как бы я это сделал, точно?
И да, я прочитал большую часть этого материала:
Процесс зомби уже мертв, поэтому его нельзя убить.
Или
Вы должны просто перезагрузить вашу систему
А также
Процессы зомби не используют никаких ресурсов, вы должны просто позволить им быть
К сожалению, многие программы проверяют таблицу процессов, чтобы узнать, запущен ли экземпляр, и отказываются запускать новый, если в таблице процессов есть запись.
И перезагрузка каждый раз, когда мое SSHFS-соединение обрывается, принимая Sublime, довольно глупо.
Ответы:
Только способ избавиться от зомби, чтобы сделать его родителей ,
wait()
поэтому он может сообщить свой статус завершения. Вы можете сделать это, отправивSIGCHLD
родителю, предполагая, что родитель написан правильно.Если у вас есть зомби, это обычно означает, что родитель НЕ написан правильно (потому что ребенок уже отправил
SIGCHLD
его родителю, когда он умер и стал зомби), поэтому следующий шаг - убить родителя.Инструмент, подобный
pstree
(с-p
опцией), может показать вам родословную ваших зомби, чтобы вы знали, какой процесс является родительским.Когда родитель умирает, его усыновляет зомби
init
, который всегдаwait()
хочет, чтобы дети умирали, и с радостью убивает всех зомби, которых он усыновляет.Если родительский процесс фактически
init
(PID 1) уже находится в ситуации, которая никогда не должна происходить. Вы можете попробовать отправитьSIGCHLD
наinit
, но вы действительно не должны делать это, и если это не работает , ваш единственный выход заключается в перезагрузке , потому что ваша системыinit
нарушается , и не выполняет свою работу.(Это варианты «дробовика».)
Некоторые более творческие люди, чем я , также предложили эту опцию, если вы хотите избежать уничтожения родительского процесса:
(в этом примере предположим, что зомби - PID 3101, а родитель - PID 3100)
gdb
иattach
к родителю:attach 3100
waitpid
зомби:call waitpid(3101,0,0)
detach
) и выйти из отладчика.(Это точно настроенная снайперская винтовка.)
источник
waitpid()
мне никогда не приходила в голову мысль об использовании отладчика для принудительного запуска . Я ужасный бывший программист ...call waitpid
никогда не вернется ко мнеПочему вы беспокоитесь о зомби-процессах? Ресурсы, которые они поддерживают, минимальны (место для задачи структуры каркаса, PID и не так много). Конечно, это неприлично, но это так. Ищите их родителей и исправляйте их, заменяйте их лучшими письменными альтернативами (могут иметь другие полезные побочные эффекты), сообщайте об этом как об ошибках (какими они, безусловно, являются).
источник