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


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

enter image description here

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


134
2017-10-15 11:27


происхождения


В принятом ответе упоминается, что "kill -9 PID не работает ». Это частично верно: на самом деле NO kill будет работать. Кроме того, -9 следует использовать в качестве последнего средства. В 99% случаев урон по умолчанию родительского процесса убьет его и пожнет всех детей «Убой по умолчанию» - это SIGTERM (-15). Я поощряю поклонников -9 (SIGKILL) читать stackoverflow.com/questions/690415/... - Mike S
stackoverflow.com/questions/356722/... - Aᴍɪʀ


ответы:


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


124
2017-10-15 11:47



вы не можете убить «несуществующий» процесс. Вы можете ускорить удаление своей записи в таблице процессов, убив ее родителя. - jfs
Что, если ppid 1 (init)? Предположим, мне просто нужно подождать? - Luc
для автоматизации убийства вы тоже можете это сделать (возможно, вам нужно будет изменить, какие байты вы вырезаете на выходе): ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9 - warren
Спасибо. Вы также можете сделать это немного короче и (imo) проще, не делая второй grep. Просто измените первый grep на grep [d]efunct или подобное, и оно не будет соответствовать самому себе. - Thor84no
@warren вы не можете убить несуществующий процесс - даже с SIGKILL. Кроме того, вы используете kill -9 довольно без разбора. Видеть stackoverflow.com/questions/690415/..., Если вы хотите убить несуществующих детей, вы можете попробовать: parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill, Перезапустите скрипт через 30 секунд или около того, с помощью kill -9 если хотите. (Обратите внимание, что я специально запрещаю убийство Init) - Mike S


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

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

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

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

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

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


44
2018-02-27 20:53