2008-12-10 8 views
48

У меня есть несуществующей процесс на моей системе:Убийство несуществующего процесса в системе 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 
+0

Тот факт, что идентификатор родительского процесса равен 1, означает, что все начатое оно мертво. Я не уверен, почему «init» еще не получил его. – 2008-12-10 16:46:08

+0

Это зомби! Не беспокойтесь, он не вреден и ничего не потребляет. – Loki 2008-12-10 17:49:26

+3

Просто увидел, что на reddit: http://www.cs.cornell.edu/Courses/cs414/2007sp/tanenbaum.jpg – Loki 2008-12-10 17:51:37

ответ

39

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

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

0

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

FWIW, я видел это совсем немного на коробке передач SCO Openserver, которую я использовал для управления. Тяжелое многопользовательское использование и низкие системные ресурсы, но это нисколько не повредило. Меня просто раздражало. :)

22

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

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

6

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

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

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

0

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

Смежные вопросы