Уничтожение несуществующего процесса в системе UNIX [закрыто]

У меня не работает процесс в моей системе:

abc      22093 19508  0 23:29 pts/4    00:00:00 grep ProcA
abc      31756     1  0 Dec08 ?        00:00:00 [ProcA_my_collect] <defunct>

Как я могу убить описанный выше процесс без перезагрузки машины? Я пробовал с

kill -9 31756
sudo kill -9 31756
10.12.2008 16:42:52
Тот факт, что идентификатор родительского процесса равен 1, означает, что независимо от того, что он запущен, он мертв. Я не уверен, почему «init» еще не получил его.
Paul Tomblin 10.12.2008 16:46:08
Это зомби! Не волнуйтесь, он не вреден и ничего не потребляет.
Loki 10.12.2008 17:49:26
Только что видел это на Reddit: cs.cornell.edu/Courses/cs414/2007sp/tanenbaum.jpg
Loki 10.12.2008 17:51:37
На солярисе есть преап, который пожинает зомби-процессы, к сожалению, не дети инициата.
Kjell Andreassen 30.08.2011 12:02:58
Процессы Локи - зомби могут создавать проблемы, если они появляются в большом количестве. Коренная причина процесса зомби, если это вызывает серьезную озабоченность.
benc 15.06.2013 19:52:30
5 ОТВЕТОВ
РЕШЕНИЕ

Вы убили процесс, но мертвый процесс не исчезает из таблицы процессов до тех пор, пока его родительский процесс не выполнит задачу, называемую «пожинанием» (по сути, вызывая wait(3)этот процесс для считывания своего состояния выхода). Мертвые процессы, которые не были получены, называются « процессами зомби ».

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

41
29.01.2013 17:19:28
Иниции, конечно, пожинает мертвых детей Подумайте о том, что это не так: каждый дочерний процесс должен завершиться раньше, чем его родитель.
janm 10.03.2009 12:14:20
Перезапуск init может помочь - в Linux у вас должна быть возможность сделать это.
bdonlan 15.06.2009 01:21:33
Последнее предложение совершенно неверно. Жать детей - почти единственное , что делает init!
William Pursell 10.02.2012 18:44:42
@WilliamPursell, спасибо, я отредактировал последнее предложение. Init действительно пожинает дочерние процессы, но, очевидно, иногда он не может избавиться от зомби.
Bill Karwin 29.01.2013 17:20:15

Вы, вероятно, не сможете, если убийство родителей не решит проблему. По какой-то причине системы не собирают этот процесс зомби.

FWIW, я видел это довольно много на ящике SCO Openserver, который я использовал для администрирования. Интенсивное многопользовательское использование и низкие системные ресурсы, но, похоже, это не повредило ничего. Просто раздражал меня. :)

0
10.12.2008 17:19:20

Вы проверили дочерний процесс, который может потребоваться сначала убить? Иногда варенье вверх по линии ... Попробуйтеps -ef --forest

чтобы увидеть, что может быть под ним (если вообще что-нибудь), сначала убейте этого, а затем того, о котором вы уже знаете

23
10.12.2008 17:33:33

Если kill -9 не может завершить процесс, причиной почти всегда является ошибка драйвера или операционной системы.

Процесс init принял процесс, но не может пожинать его. То есть: когда init вызывает wait (2), этот процесс не возвращается. Одна из основных целей init состоит в том, чтобы пожинать мертвых детей-сирот, поэтому проблема не в том, что его родитель умер до того, как его пожинают. Подумайте: в противном случае, кто пожнет результаты процесса nohup'd после выхода из системы?

Убийство детей из несуществующего процесса вряд ли поможет, если они не связаны с какой-то конкретной ошибкой, которую вы видите.

6
10.03.2009 12:07:31
«Если kill -9 не может завершить процесс, причиной почти всегда является ошибка драйвера или операционной системы». Это правда, за исключением несуществующего процесса. kill -9 не собирается ничего делать для несуществующего процесса, только отправляет SIGKILL ядру информацию о процессе, но ядро ​​не управляет таблицей процессов на основе этого сигнала.
benc 15.06.2013 20:02:16
@benc: Я согласен, процесс зомби уже мертв и больше не умрет в ответ на SIGKILL. Тем не менее, остальная часть моего ответа остается: Кажется, есть ошибка, приводящая к тому, что init не вызывает этот процесс, когда он вызывает wait ().
janm 17.06.2013 06:59:09

Процесс, вероятно, зависает, например, игнорируя такие сигналы, как SIGPIPE, узнайте, strace -p <pid>что здесь происходит.

0
4.01.2013 20:09:55