Альтернативный способ убить зомби-процесс


19

Я только что заметил некоторые процессы зомби на 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>

Как вы можете видеть, они работают в течение двух месяцев, и если бы они не были вредными, я бы от них избавился, есть ли альтернативный способ убить зомби?


1
ты пробовал kill -9?
Ипор Сирсер,

7
Только 747и 29971зомби-процессы. Другие могут быть заперты, но они еще не умерли.
Ройма

Кажется, у вас есть ошибка в каком-то коде, работающем на tomcat ...
Борис Паук

Ответы:


8

Как упоминал Химайл, вы не можете убить зомби. Он уже [мертв] ...

Однако проблема, с которой вы сталкиваетесь, выглядит как проблема с git cloneкомандой. Как-то застревает. Возможно, истекло время ожидания или что-то не так? Часто из-за некоторого ввода-вывода процесс застревает до такой степени, что SIGTERMи SIGINTне будет работать.

Чтобы убить его, в этом случае вы хотите использовать параметр -9командной строки. Это значит отправить SIGKILLсигнал. Вы действительно можете использовать -KILLтоже.

[root@host user]# kill -KILL 746 29970

Чтобы получить список доступных сигналов, используйте опцию командной строки list.

[root@host user]# kill -l

Это показывает вам цифры и имена (и вы увидите, что № 9 говорит SIGKILL.)


1
На самом деле это kill -KILLбыла единственная команда, способная закрыть эти процессы, поэтому я приму ответ @Alexis Wilke. Но, конечно же, я хотел бы выразить свою благодарность @heemayl за быстрый, мудрый и очень информативный ответ +1. Спасибо всем
lese

39

Вы не можете убить Зомби (процесс), он уже мертв. Он просто ждет, пока его родительский процесс выполнит wait(2)и соберет свой статус выхода. Это не займет никаких ресурсов в системе, кроме записи таблицы процессов.

Вы можете отправить SIGCHLDего родителю, чтобы сообщить ему, что один из его дочерних элементов был прекращен (то есть запросить его для получения статуса выхода дочернего элемента). Этот сигнал можно игнорировать (это значение по умолчанию):

kill -CHLD <PPID>

(Заменить <PPID>фактическим PID родителя.)

Или вы можете убить родительский процесс, чтобы init(PID 1) унаследовал процесс зомби и пожинал его должным образом (это одна из initглавных задач - унаследовать любого сироту и делать это wait(2)регулярно). Но убивать родителей не рекомендуется. Как правило, создание процессов зомби указывает на проблему / проблемы программирования, и вы должны попытаться исправить или сообщить об этом вместо этого.


8
Вы можете отправить SIGCHLD его родителю, чтобы он знал, что один, если его дочерние элементы были прекращены (то есть, запрашивает его для получения статуса выхода дочернего элемента), этот сигнал можно игнорировать (по умолчанию) . Проблема в том, что если процесс игнорирует SIGCHLD, то нет зомби будет создан. Так что, если это не игнорирование SIGCHLD, и зомби не пожинаются, процесс либо глючит, либо не заботится о детях-зомби. Учитывая, что рассматриваемый процесс таков git clone ..., я держу пари, что он просто не заботится о детях-зомби, так как это (надеюсь) недолговечный процесс, который выполняет свою работу и затем завершается.
Эндрю Хенле

1
@AndrewHenle: Хотя это в основном верно, действие по умолчанию для ( SIG_DFL) SIGCHILDтакже игнорирует его, но в этом случае зомби, скорее всего, не будут автоматически получены.
R ..

@R Хотя это в основном верно, по умолчанию action ( SIG_DFL) for SIGCHILDтакже игнорирует его, но в этом случае зомби, скорее всего, не будут автоматически получены. Я не уверен, что вы имеете в виду. Ты имеешь в виду, что в этом вопросе не говорится о процессах? Я не вижу, как отправка SIGCHLDпроцессу, для которого установлен SIGCHLDобработчик SIG_IGN(явно или по умолчанию), приведет к тому, что этот процесс будет пожинать зомби.
Эндрю Хенле

1
@ AndrewHenle, отправка SIGCHLDможет работать в этот раз . В последний раз он мог пропустить сигнал, или два ребенка умерли одновременно, и код не достаточно умен, чтобы обрабатывать обе смерти одновременно.
Алексис Уилк

Это не может повредить, но я бы не сказал, что это сработает.
Бармар

2

искать зомби-процессы:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

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

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

Когда родительский процесс умирает, весь процесс зомби будет очищен. Не убивайте родительский процесс только для того, чтобы очистить зомби-процесс. Это придет снова, когда вы перезапустите свою программу. Исправьте вашу программу с помощью правильного вызова системного вызова wait () или waitpid ().

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.