Браузер Chrome не реагировал, и я попытался убить его, но вместо того, чтобы исчезнуть, процесс был <defunct>
справа от него, и не был убит:
Что такое <defunct>
для процесса и почему он не убивается?
Браузер Chrome не реагировал, и я попытался убить его, но вместо того, чтобы исчезнуть, процесс был <defunct>
справа от него, и не был убит:
Что такое <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
.
Страница руководства 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
смотрите Ответ Jfs для более технических рассуждений.
Я случайно создаю <defunct>
процессы с помощью
Решение состоит в том, чтобы попробовать выполнить команду 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 CMDuser 25707 25697 0 Feb26 pts/0 00:00:00 [sh] пользователь 30381 29915 0 11:46 pts/7 00:00:00 grep не функционирует------------------------------ Родители:25697 человек/0 00:00:00 npm
Спасибо, Майк С. Мы взяли вашу реплику и написали сценарий, который уничтожит несуществующие процессы, родительский файл которых находится в файле.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-TELNETfi
В принятом ответе упоминается, что "kill -9 PID
не работает". Отчасти это правда: на самом деле НИКАКОЕ убийство не сработает. Кроме того, -9 следует использовать в крайнем случае. В 99% случаев уничтожение родительского процесса по умолчанию приведет к его уничтожению И уничтожению всех дочерних процессов. “Уничтожение по умолчанию” - это SIGTERM (-15). Я призываю поклонников -9 (SIGKILL) прочитать bash - In what order should I send signals to gracefully shutdown processes? - Stack Overflow
names matter a lot, presenting <zombie>" вместо того, чтобы