Что такое несуществующий процесс и почему его не убивают?

115

Браузер Chrome не реагировал, и я попытался его убить, но вместо исчезновения процесс имел <defunct> справа от него и не был убит:

Что такое <defunct> для процесса и почему его не убивают?

    
задан Eduard Florinescu 15.10.2012 в 13:27
источник

2 ответа

106

Из вашего вывода мы видим «несуществующий», что означает, что процесс либо выполнил свою задачу, либо был поврежден, либо убит, но его дочерние процессы все еще запущены или этот родительский процесс контролирует свой дочерний процесс. Чтобы убить этот процесс, kill -9 PID не работает. Вы можете попытаться убить их с помощью этой команды, но она будет показывать это снова и снова.

Определите, который является родительским процессом этого несуществующего процесса и убивает его. Чтобы узнать это, выполните команду:

ps -ef | grep defunct

UID          PID     PPID       C    STIME      TTY          TIME              CMD
1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

Затем kill -9 637 27872 , затем проверьте, что несуществующий процесс исчез на ps -ef | grep defunct .

    
ответ дан Paddington 15.10.2012 в 13:47
источник
38

Ручная страница ps (1) говорит :

  

Процессы с надписью <defunct> являются мертвыми процессами (так называемые "зомби" )   которые остаются, потому что их родитель не уничтожил их должным образом.   Эти процессы будут уничтожены init(8) , если родительский процесс   выходов.

Вы не можете убить его, потому что он уже мертв. Осталось только запись в таблице процессов :

  

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

Нет вреда в разрешении таких процессов, если их много. Зомби в конечном итоге получают свою родительскую компанию (вызывая wait(2) ). Если исходный родитель не получил его до своего собственного выхода, то процесс init ( pid == 1 ) делает это через некоторое время. процесс Zombie - это просто:

  

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

    
ответ дан jfs 27.02.2014 в 21:53