Домашня » як » Що таке «зомбі-процес» на Linux?

    Що таке «зомбі-процес» на Linux?

    Якщо ви є користувачем Linux, ви, можливо, бачили зомбі-процеси, які б'ються навколо списку процесів. Ви не можете вбити зомбі-процес, оскільки він вже мертвий - як справжній зомбі.

    Зомбі в основному залишилися біт мертвих процесів, які не були очищені належним чином. Програма, яка створює зомбі-процеси, не запрограмована належним чином - програми не повинні дозволяти зомбі-процесам стикатися.

    Зображення: Daniel Hollister на Flickr (ремікс)

    Що таке зомбі-процес?

    Щоб зрозуміти, що таке зомбі-процес і що викликає появу зомбі-процесів, потрібно трохи зрозуміти, як процеси працюють у Linux.

    Коли процес загине на Linux, він не відразу вилучається з пам'яті - дескриптор процесу залишається в пам'яті (дескриптор процесу займає лише невелику кількість пам'яті). Стан процесу стає EXIT_ZOMBIE, а батьківський процес - повідомляється, що його дочірній процес помер з сигналом SIGCHLD. Батьківський процес повинен виконати системний виклик wait (), щоб прочитати стан виходу з мертвого процесу та іншу інформацію. Це дозволяє батьківському процесу отримувати інформацію з мертвого процесу. Після виклику wait () процес зомбі повністю видаляється з пам'яті.

    Зазвичай це відбувається дуже швидко, тому ви не бачите процеси зомбі, які накопичуватимуться у вашій системі. Однак, якщо батьківський процес не запрограмований належним чином і ніколи не викликає wait (), його зомбі-діти залишаться в пам'яті, поки вони не очистяться.

    Утиліти типу GNOME System Monitor, зверху і команду ps Команда відображення зомбі-процесів.

    Небезпеки зомбі-процесів

    Зомбі-процеси не використовують жодних системних ресурсів. (Насправді кожен використовує дуже маленьку кількість системної пам'яті для зберігання свого дескриптора процесу.) Однак кожен зомбі-процес зберігає свій ідентифікатор процесу (PID). Системи Linux мають кінцеве число ідентифікаторів процесу - 32767 за замовчуванням на 32-бітних системах. Якщо зомбі накопичуються дуже швидкими темпами - наприклад, якщо неправильно запрограмоване серверне програмне забезпечення створює зомбі-процеси під навантаженням - весь пул доступних ПІД в кінцевому підсумку буде призначений для зомбі-процесів, що перешкоджає запуску інших процесів.

    Тим не менш, кілька зомбі процесів, що висять навколо, не є проблемою - хоча вони вказують на помилку з батьківським процесом у вашій системі.

    Позбавлення від зомбі-процесів

    Ви не можете вбивати зомбі-процеси, оскільки ви можете вбити нормальні процеси за допомогою сигналу SIGKILL - зомбі-процеси вже мертві. Майте на увазі, що вам не потрібно позбавлятися від зомбі-процесів, якщо у вас є велика сума в системі - кілька зомбі нешкідливі. Однак є кілька способів позбутися зомбі-процесів.

    Одним із способів є надсилання сигналу SIGCHLD до батьківського процесу. Цей сигнал повідомляє батьківському процесу виконати системний виклик wait () і очистити своїх дітей від зомбі. Надішліть сигнал за допомогою вбивати команда, заміна pid у команді нижче з PID основного процесу:

    вбиває SIGCHLD pid

    Однак, якщо батьківський процес не запрограмований належним чином і ігнорує сигнали SIGCHLD, це не допоможе. Ви повинні будете вбити або закрити батьківський процес зомбі. Коли процес, що створив зомбі, закінчується, init успадковує зомбі-процеси і стає їх новим батьком. (init - це перший процес, запущений на Linux при завантаженні і призначений PID 1.) init періодично виконує системний виклик wait () для очищення своїх зомбі-дітей, тому init зробить коротку роботу зомбі. Ви можете перезапустити батьківський процес після його закриття.

    Якщо батьківський процес продовжує створювати зомбі, він повинен бути виправлений так, щоб він належним чином викликав wait (), щоб пожинати своїх зомбі-дітей. Надішліть звіт про помилку, якщо програма у вашій системі продовжує створювати зомбі.