Браузер Chrome не реагировал, и я попытался убить его, но вместо исчезновения процесс имел <defunct>
справа и не был убит:
[ 114]
Что такое <defunct>
для процесса и почему его не убивают?
Из вашего вывода мы видим «несуществующий», что означает, что процесс либо завершил свою задачу, либо был поврежден или уничтожен, но его дочерние процессы все еще работают или эти родительские процессы отслеживают свой дочерний процесс. Чтобы убить такой процесс, 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
.
Спасибо 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
Добавляя к ответу @ 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
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
см. Ответ Дж. Ф. Себастьяна для более технических рассуждений.
Я случайно создал <несуществующий>
процессы,
Решение состоит в том, чтобы попробовать команду fg
в каждом открытом окне терминала.
Затем несуществующие процессы исчезают.