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


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є процес зомбі. Інші можуть бути замкнені, але вони ще не мертві.
roaima

Здається, у вас є помилка в якомусь коді, який працює на 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. Дякую всім
орендуйте

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 Хоча це в основному вірно, дія за замовчуванням ( SIG_DFL) для 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.