Процес зомбі не матиме ніякого впливу на продуктивність або повільність, оскільки зомбі-процеси не використовують жодних системних ресурсів.
Примітка: - Практично, він все ще використовує PID (який є обмеженим ресурсом), і структури даних ядра для процесу все ще виділяються. Зазвичай це не має великого значення, але використання пам'яті ядра може бути значним у системах з дуже обмеженою пам'яттю.
Проблема, викликана процесом зомбі
Кожен процес зомбі зберігає свій ідентифікатор процесу. Системи Linux мають обмежену кількість ідентифікаторів процесів - 32767 за замовчуванням для 32-бітних систем. Якщо зомбі накопичуються дуже швидко, весь пул доступних PID-файлів з часом стане призначений для процесів зомбі, не дозволяючи запускати інші процеси.
Примітка . У 64-бітних системах ви можете збільшити максимальний PID, див. Https://unix.stackexchange.com/a/16884/170373
Однак декілька зомбі-процесів, що зависають, не є проблемою - хоча вони і вказують на помилку з батьківським процесом у вашій системі.
Пояснення:
Коли процес гине в Linux, він не видаляється з пам'яті відразу, його дескриптор процесу залишається в пам'яті.
Статус процесу стає EXIT_ZOMBIE
і батько процесу повідомляється, що його дочірній процес загинув за допомогою SIGCHLD
сигналу.
Потім батьківський процес повинен виконати виклик системи wait () для зчитування стану виходу мертвого процесу та іншої інформації. Це дозволяє батьківському процесу отримати інформацію з мертвого процесу. Після виклику wait () процес зомбі повністю вилучається з пам'яті.
Зазвичай це відбувається дуже швидко, тому ви не побачите процесів зомбі, що накопичуються у вашій системі. Однак якщо батьківський процес не запрограмований належним чином і ніколи не викликає функцію wait (), його зомбі діти залишатимуться в пам'яті, поки вони не очистяться.
Роздільна здатність:
Ви не можете вбивати процесів зомбі, оскільки ви можете вбивати нормальні процеси за допомогою сигналу SIGKILL - процеси зомбі вже мертві.
Один із способів вбивства зомбі - це надсилання сигналу SIGCHLD батьківському процесу. Цей сигнал вказує батьківському процесу виконати виклик системи wait () та очистити своїх дітей-зомбі. Надішліть сигнал командою kill, замінивши pid в команді нижче на PID батьківського процесу:
kill -s SIGCHLD pid
Коли процес, який створив зомбі, закінчується, init успадковує процеси зомбі і стає їх новим батьківським. (init - це перший процес, запущений в Linux під час завантаження і йому присвоюється PID 1.)
Примітка: - З Linux 3.4 процеси можуть видати системний виклик prctl () за допомогою параметра PR_SET_CHILD_SUBREAPER, і в результаті вони, не обробляючи номер 1, стануть батьком своїх осиротілих нащадків. Посилання: /unix//a/177361/5132
Потім INIT виконує виклик системи wait (), щоб очистити своїх дітей-зомбі, тому init зробить коротку роботу зомбі. Ви можете перезапустити батьківський процес після його закриття.