Что такое процесс <defunct> и почему его не убивают?
Браузер Chrome не реагировал, и я попытался убить его, но вместо исчезновения процесс <defunct>
справа и не убили
Что такое <defunct>
за процесс и почему его не убить?
7 ответов
Из вашего вывода мы видим "несуществующий", что означает, что процесс либо завершил свою задачу, либо был поврежден или уничтожен, но его дочерние процессы все еще работают или эти родительские процессы отслеживают свой дочерний процесс. Чтобы убить такой процесс, 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
,
Страница руководства ps(1) гласит:
Процессы отмечены
<defunct>
мертвые процессы (так называемые "зомби"), которые остаются, потому что их родитель не уничтожил их должным образом. Эти процессы будут уничтоженыinit(8)
если родительский процесс завершается.
Вы не можете убить его, потому что он уже мертв. Остается только запись в таблице процессов:
В Unix и Unix-подобных компьютерных операционных системах процесс зомби или несуществующий процесс - это процесс, который завершил выполнение, но все еще имеет запись в таблице процессов. Эта запись все еще необходима для того, чтобы родительский процесс мог прочитать статус выхода своего дочернего процесса.
Нет ничего плохого в том, чтобы позволить таким процессам быть, если их не много. Зомби в конце концов пожинает его родитель (wait(2)
). Если исходный родитель не получил его до своего выхода, init
процесс (pid == 1
) делает это позже. Зомби Процесс это просто:
Процесс, который завершился и который удален, когда его состояние завершения было сообщено другому процессу, который ожидает завершения этого процесса.
Развивая ответ Паддингтона..
Из вашего вывода мы видим несуществующий, что означает, что этот дочерний процесс либо выполнил свою задачу, либо был поврежден или уничтожен. Его родительский процесс все еще выполняется и не заметил своего мертвого потомка.
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
см. ответ Дж.Ф. Себастьяна для более технических рассуждений.
Я случайно создаю
<defunct>
процессы
- запускать их с терминала и
- затем случайно поместив их на задний план (Ctrl+Z) и
- каким-то образом завершить программу.
Решение - попробовать команду
fg
в каждом открытом окне терминала. Потом отмершие процессы исчезают.
В дополнение к ответу @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
}
Это выводит что-то вроде:
Дети: UID PID PPID C STIME TTY TIME CMD пользователь 25707 25697 0 фев 26 баллов /0 00:00:00 [sh] пользователь 30381 29915 0 11:46 баллов /7 00:00:00 grep defunct ------------------------------ Родители: 25697 баллов / 0 00:00:00 вечера
Спасибо, Майк С. Мы взяли вашу строку и написали скрипт, который уничтожит несуществующие процессы, чьим родителем является 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
У меня был зомби-приложение libreoffice, висевший с и «Z». и его PPID был равен 1 (потому что я убил вызывающее приложение oosplash после того, как LibreOffice больше не отвечал). Однако никакие файлы не использовались зомби. Тем не менее, значки офиса все еще были на моем рабочем столе / панели задач.
Мне удалось очистить приложение (или идентификатор процесса) и снова запустить libreoffice без перезагрузки:
Сначала я удалил файл .lock в каталоге ~/.config/libreoffice/. (не знаю, актуально ли это, но просто для полноты того, что я сделал). Затем я запустил libreoffice на другом хосте (под тем же логином). Офис запустился нормально на этом новом хосте. При этом: пропали все "висячие" иконки libreoffice. Как только «Восстановление документа» было завершено, я закрыл все открытые документы и вышел из libreoffice на этом новом хосте. (Обратите внимание, что файлы документов находятся на файловом сервере, доступном для обоих хостов.)
Я перезапустил libreoffice на исходном хосте, все прошло без проблем и без перезагрузки.
Возможно, рецепт работает не всегда, может быть совпадение с тем, что мой хост очищает сиротский процесс точно в то же время, но мне повезло избежать перезагрузки. Может быть, это помогает и другим. просто попробуйте.
Удачи!