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

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

enter image description here [ 114]

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

186
задан 30 May 2016 в 14:53

6 ответов

Из вашего вывода мы видим «несуществующий», что означает, что процесс либо завершил свою задачу, либо был поврежден или уничтожен, но его дочерние процессы все еще работают или эти родительские процессы отслеживают свой дочерний процесс. Чтобы убить такой процесс, 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.

0
ответ дан 30 May 2016 в 14:53

Спасибо Mike S. Мы проводили Вашу строку и записали сценарий, который уничтожит более не существующие процессы, родитель которых является in.telnetd. Мы не хотели, чтобы это уничтожило любой родительский процесс, просто telnetd, что мы знаем, вызывает проблему, и мы выполним его многократно для уничтожения нескольких в случае необходимости.

# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.

first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"

# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
        echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
        echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
        kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi
1
ответ дан 30 May 2016 в 14:53

Добавляя к ответу @ Paddington, я добавил эту функцию в свой bashrc для быстрой проверки:

defunct(){
    echo "Children:"
    ps -ef | head -n1
    ps -ef | grep defunct
    echo "------------------------------"
    echo "Parents:"
    ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
    echo "$ppids" | while read ppid; do
        ps -A | grep "$ppid"
    done
}

Он выводит что-то вроде:

Children:
UID        PID  PPID  C STIME TTY          TIME CMD
user     25707 25697  0 Feb26 pts/0    00:00:00 [sh] 
user     30381 29915  0 11:46 pts/7    00:00:00 grep defunct
------------------------------
Parents:
25697 pts/0    00:00:00 npm
0
ответ дан 30 May 2016 в 14:53

PS страницы руководства (1) говорит:

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

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

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

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

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

61
ответ дан 30 May 2016 в 14:53

Расширяя ответ Паддингтона ..

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

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>

Посмотрите, кто является родителем: ps ax | grep 27872

Если Вы хотите, вы можете убить родителя, и несуществующий уйдет. kill -9 27872

см. Ответ Дж. Ф. Себастьяна для более технических рассуждений.

0
ответ дан 30 May 2016 в 14:53

Я случайно создал <несуществующий> процессы,

  • запустив их из терминала и
  • затем случайно поместив их в фоновый режим (Ctrl+Z) и
  • каким-то образом завершив программу.

Решение состоит в том, чтобы попробовать команду fg в каждом открытом окне терминала. Затем несуществующие процессы исчезают.

3
ответ дан 26 August 2020 в 10:59

Другие вопросы по тегам:

Похожие вопросы: