Я только что заметил некоторые процессы зомби на CentOS 6.8 (Final), пытался убить их, но они все еще там:
[root@host user]# ps -ef | grep git
tomcat 746 1 0 Jul18 ? 00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat 747 746 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
root 20776 20669 0 09:03 pts/3 00:00:00 grep git
tomcat 29970 1 0 Jul18 ? 00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat 29971 29970 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
[root@host user]# kill 746 747 29970 29971
[root@host user]# ps -ef | grep git
tomcat 746 1 0 Jul18 ? 00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat 747 746 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
root 21525 20669 0 09:26 pts/3 00:00:00 grep git
tomcat 29970 1 0 Jul18 ? 00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat 29971 29970 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
Как вы можете видеть, они работают в течение двух месяцев, и если бы они не были вредными, я бы от них избавился, есть ли альтернативный способ убить зомби?
kill -9
?747
и29971
зомби-процессы. Другие могут быть заперты, но они еще не умерли.Ответы:
Как упоминал Химайл, вы не можете убить зомби. Он уже [мертв] ...
Однако проблема, с которой вы сталкиваетесь, выглядит как проблема с
git clone
командой. Как-то застревает. Возможно, истекло время ожидания или что-то не так? Часто из-за некоторого ввода-вывода процесс застревает до такой степени, чтоSIGTERM
иSIGINT
не будет работать.Чтобы убить его, в этом случае вы хотите использовать параметр
-9
командной строки. Это значит отправитьSIGKILL
сигнал. Вы действительно можете использовать-KILL
тоже.Чтобы получить список доступных сигналов, используйте опцию командной строки list.
Это показывает вам цифры и имена (и вы увидите, что № 9 говорит SIGKILL.)
источник
kill -KILL
была единственная команда, способная закрыть эти процессы, поэтому я приму ответ @Alexis Wilke. Но, конечно же, я хотел бы выразить свою благодарность @heemayl за быстрый, мудрый и очень информативный ответ +1. Спасибо всемВы не можете убить Зомби (процесс), он уже мертв. Он просто ждет, пока его родительский процесс выполнит
wait(2)
и соберет свой статус выхода. Это не займет никаких ресурсов в системе, кроме записи таблицы процессов.Вы можете отправить
SIGCHLD
его родителю, чтобы сообщить ему, что один из его дочерних элементов был прекращен (то есть запросить его для получения статуса выхода дочернего элемента). Этот сигнал можно игнорировать (это значение по умолчанию):(Заменить
<PPID>
фактическим PID родителя.)Или вы можете убить родительский процесс, чтобы
init
(PID 1) унаследовал процесс зомби и пожинал его должным образом (это одна изinit
главных задач - унаследовать любого сироту и делать этоwait(2)
регулярно). Но убивать родителей не рекомендуется. Как правило, создание процессов зомби указывает на проблему / проблемы программирования, и вы должны попытаться исправить или сообщить об этом вместо этого.источник
SIGCHLD
, то нет зомби будет создан. Так что, если это не игнорированиеSIGCHLD
, и зомби не пожинаются, процесс либо глючит, либо не заботится о детях-зомби. Учитывая, что рассматриваемый процесс таковgit clone ...
, я держу пари, что он просто не заботится о детях-зомби, так как это (надеюсь) недолговечный процесс, который выполняет свою работу и затем завершается.SIG_DFL
)SIGCHILD
также игнорирует его, но в этом случае зомби, скорее всего, не будут автоматически получены.SIG_DFL
) forSIGCHILD
также игнорирует его, но в этом случае зомби, скорее всего, не будут автоматически получены. Я не уверен, что вы имеете в виду. Ты имеешь в виду, что в этом вопросе не говорится о процессах? Я не вижу, как отправкаSIGCHLD
процессу, для которого установленSIGCHLD
обработчикSIG_IGN
(явно или по умолчанию), приведет к тому, что этот процесс будет пожинать зомби.SIGCHLD
может работать в этот раз . В последний раз он мог пропустить сигнал, или два ребенка умерли одновременно, и код не достаточно умен, чтобы обрабатывать обе смерти одновременно.искать зомби-процессы:
чтобы убить процесс зомби, родительские идентификаторы должны быть убиты, т.е. PPID:
источник
Когда родительский процесс умирает, весь процесс зомби будет очищен. Не убивайте родительский процесс только для того, чтобы очистить зомби-процесс. Это придет снова, когда вы перезапустите свою программу. Исправьте вашу программу с помощью правильного вызова системного вызова wait () или waitpid ().
источник