Назад | Перейти на главную страницу

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

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

Как бы я именно это сделал?

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

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

Или

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

И

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

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

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

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

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

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

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