Відповіді:
О, Боже! Ні-ні-ні. Не використовуйте kill -9.
Це не дає процесу чисто:
вимкнути розетки
очищення тимчасових файлів
повідомити своїх дітей, що вона йде
скиньте його термінальні характеристики тощо, і так далі, і так далі.
Як правило, надішліть 15, і зачекайте секунду-дві, і якщо це не працює, надішліть 2, а якщо це не працює, надішліть 1. Якщо цього не відбувається, ВИДАЛУЙТЕ БІННЯР, оскільки програма погано ведеться!
Не використовуйте kill -9. Не виймайте зернозбиральний комбайн лише для того, щоб привести в порядок квітковий горщик.
Процес зомбі (насправді їх зараз називають <defunct>
) насправді не є процесом. Це лише запис у таблицю процесів, тому батьківський процес може виконувати wait()
syscall .
Ви не повинні турбуватися про них. Вони не займають ніяких ресурсів, вони зникнуть або тоді, коли їхній батько зателефонує, wait()
коли сам батько помре.
Однак відповідь вже прийнята: ви МОЖЕТЕ вбити процес зомбі. Приєднайте за допомогою налагоджувача до батьківського процесу та викличте функцію очікування. Наприклад: - припустимо, що у батьків є PID = 100, процес зомбі має PID = 200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
Процес зомбі не виділяє йому жодних ресурсів, крім запису в дереві процесів. Це трапляється, коли процес завершується, однак батьківський процес ще його не отримав (тобто wait
редагується на ньому).
Ви можете спробувати змусити батьків зробити це, якщо хочете, надіславши його SIGCHLD ( kill -20
), батькові, але немає гарантії, що батько його буде шанувати.
Ви їх часто бачите за короткий проміжок часу (наприклад, переглядаючи дерево процесів за допомогою верху) - це нормально; У часовий відрізок між часом, який завершується дочірнім процесом, і батьківським опитуванням за нього - дочірній процес з’явиться як зомбі.
Якщо ви бачите зомбі-процеси, які постійно існують, - але це не нормально - все одно не варто турбуватися - знову ж таки, оскільки немає ресурсу, виділеного на мертвий процес - це, як правило, означає, що додаток погано написаний хитрими розробниками.
Єдиний час, коли ви повинні бути стурбовані зомбі-процесами, це коли ви бачите багато і багато з них, наприклад, якщо той самий хиткий додаток, згаданий вище, знаходиться під навантаженням.
У нас є багато шалених розробників, де я працюю, і тому я маю привілей займатися такими питаннями та вивчати всілякі непотрібні речі, роблячи це. Насправді - моя команда часто вдається до використання шалених сценаріїв оболонок, написаних розлюченими розробниками в інтерв'ю, - якщо кандидат може вибрати, що сценарій справді божевільний, і сказати нам, чому це шалено, у нього хороша нога у двері.
Що стосується віртуальної рушниці ...
$ shoot <pid>
#! / бін / ш жертва = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' ` жертва \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {жертва} \ b" | голова -n 1 | awk '{print $ 2}' ` #kill $ {жертва} ехо "Вбито $ {ім'я_ жертви}."
І пам’ятайте: завжди стріляйте ними в голову.
Процес зомбі - це процес, який завершився виконанням, але все ще перерахований у таблиці процесів.
kill -9 [батьківська_файла_назва] поставить це вниз, з крайнім упередженням.