Удалить процесс зомби из таблицы процессов

8

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

Как бы я это сделал, точно?

И да, я прочитал большую часть этого материала:

Процесс зомби уже мертв, поэтому его нельзя убить.

Или

Вы должны просто перезагрузить вашу систему

А также

Процессы зомби не используют никаких ресурсов, вы должны просто позволить им быть

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

И перезагрузка каждый раз, когда мое SSHFS-соединение обрывается, принимая Sublime, довольно глупо.

skerit
источник
7
... с дробовиком. ;)
Натан C
+1, потому что я посмотрел на главную и увидел «убить зомби»
HopelessN00b

Ответы:

16

Только способ избавиться от зомби, чтобы сделать его родителей , wait()поэтому он может сообщить свой статус завершения. Вы можете сделать это, отправив SIGCHLDродителю, предполагая, что родитель написан правильно.

Если у вас есть зомби, это обычно означает, что родитель НЕ написан правильно (потому что ребенок уже отправил SIGCHLDего родителю, когда он умер и стал зомби), поэтому следующий шаг - убить родителя.
Инструмент, подобный pstree-pопцией), может показать вам родословную ваших зомби, чтобы вы знали, какой процесс является родительским.
Когда родитель умирает, его усыновляет зомби init, который всегда wait()хочет, чтобы дети умирали, и с радостью убивает всех зомби, которых он усыновляет.

Если родительский процесс фактически init(PID 1) уже находится в ситуации, которая никогда не должна происходить. Вы можете попробовать отправить SIGCHLDна init, но вы действительно не должны делать это, и если это не работает , ваш единственный выход заключается в перезагрузке , потому что ваша системы initнарушается , и не выполняет свою работу.

(Это варианты «дробовика».)


Некоторые более творческие люди, чем я , также предложили эту опцию, если вы хотите избежать уничтожения родительского процесса:

  1. Определите PIDS зомби и родительских процессов
    (в этом примере предположим, что зомби - PID 3101, а родитель - PID 3100)
  2. Запустите gdbи attachк родителю:
    attach 3100
  3. Вызов waitpidзомби:
    call waitpid(3101,0,0)
  4. Отключиться от родителя ( detach) и выйти из отладчика.

(Это точно настроенная снайперская винтовка.)

voretaq7
источник
1
хех, отличный ответ. Винтовка "Мосин" тут же.
Данила Ладнер,
1
@DanilaLadner Хотел бы я взять кредит, но пока я не пошел на небольшую охоту на Google, чтобы посмотреть, что означает скерит о «прикреплении зомби как ребенка к фиктивному процессу», waitpid()мне никогда не приходила в голову мысль об использовании отладчика для принудительного запуска . Я ужасный бывший программист ...
voretaq7
call waitpidникогда не вернется ко мне
deFreitas
0

Почему вы беспокоитесь о зомби-процессах? Ресурсы, которые они поддерживают, минимальны (место для задачи структуры каркаса, PID и не так много). Конечно, это неприлично, но это так. Ищите их родителей и исправляйте их, заменяйте их лучшими письменными альтернативами (могут иметь другие полезные побочные эффекты), сообщайте об этом как об ошибках (какими они, безусловно, являются).

vonbrand
источник