Відповіді:
Процеси зомбі вже мертві. Ви не можете їх вбити. kill
Виклик команди або система не робить ніякого впливу на процес зомбі. (Ви можете змусити зомбі піти kill
, але вам доведеться застрелити батьків, а не зомбі, як ми побачимо через хвилину.)
Процес зомбі насправді не є процесом, це лише запис у таблиці процесів. Немає інших ресурсів, пов’язаних із зомбі-процесом: у нього немає пам'яті та будь-якого запущеного коду, не тримає жодних файлів відкритих тощо.
Коли процес вмирає, останнє, що після закінчення очищення інших ресурсів, - це запис у таблиці процесів. Цей запис зберігається навколо, утворюючи зомбі, щоб дозволити батьківському процесу відстежувати статус виходу дитини. Батько зчитує стан виходу, зателефонувавши до однієї з wait
сімейних системних дзвінків ; в цей момент зомбі зникає. wait
Кажуть, що дзвінок пожинає дитину, поширюючи метафору мертвого зомбі, але якимось чином ще не повністю перероблений у потойбічне життя. Батько також може вказати, що це не хвилює (ігноруючи сигнал SIGCHLD або зателефонувавши sigaction
з SA_NOCLDWAIT
прапором), у цьому випадку запис у таблицю процесу видаляється негайно, коли дитина помирає.
Таким чином, зомбі існує лише тоді, коли процес загинув і його батько ще не зателефонував wait
. Цей стан може тривати лише до тих пір, поки батьків ще не працює. Якщо батько помирає перед дитиною або помирає, не читаючи статусу дитини, батьківський процес зомбі встановлюється на процес з PID 1, який є init
. Одне з завдань init
- зателефонувати wait
в цикл і, таким чином, скористатися будь-яким зомбі-процесом, який залишив його батько.
Ви не kill
займаєтеся зомбі, оскільки він уже мертвий.
Процеси зомбі повинні wait
редагувати батьки, щоб зібрати їх статус виходу.
Єдиний "вбудований механізм очищення", який існує в Linux, працює в тому випадку, коли будь-який батьківський процес помирає, перш ніж він збирає статус виходу своїх дітей. У цьому випадку кожна дитина успадковується init
процесом, який wait
здійснюватиме дитину, збирає її вихідний статус та видаляє його запис у таблиці процесів.
Як тільки батько процесу помирає, процес стає сиротою - ігноруючи, чи це зомбі чи ні. Що відбувається з сиротами? Вони отримують нового батька, називають init
. init
буде wait
на кожного сироту, яке вона зібрала, тим самим пожинаючи сироту (що, можливо, теж було зомбі).
Ні, немає вбудованого механізму очищення від зомбі. Зомбі йдуть на небо зомбі, коли їх батька вбивають. До цього часу ОС зберігає їх, щоб повернути вихідний статус батьківському.
init
це не вбиває жодного процесу. Тількиwait
діти повинні зібрати свій статус.