Процес-зомбі
Також: неіснуючий процес (defunct)
Коротка відповідь
Процес-зомбі — це процес, який уже завершив роботу, але досі має запис у таблиці процесів, бо батьківський процес ще не забрав його код завершення. Він не використовує процесор і майже не займає памʼяті.
Коли процес завершується, система зберігає невеликий запис, щоб батьківський процес міг дізнатися, як він завершився. Зазвичай батьківський процес одразу читає цей запис, і він зникає. Якщо цього так і не стається, завершений процес лишається в списку як зомбі.
Кілька зомбі нешкідливі. Кількість, що постійно зростає, вказує на помилку в батьківській програмі.
Як знайти процеси-зомбі на Mac
У Терміналі виконайте ps -axo pid,ppid,stat,comm | awk '$3 ~ /^Z/'. Кожен рядок — це зомбі, а стовпець PPID показує батьківський процес, який за нього відповідає.
Як позбутися процесу-зомбі
Зомбі неможливо завершити, бо він уже завершився. Рішення — у батьківському процесі. Завершіть або перезапустіть батьківську програму, і зомбі перейде до launchd, який його прибере.
Не завершуйте launchd чи інші системні процеси, щоб прибрати зомбі. Якщо батьківський процес системний, їх прибере перезапуск Mac.
Як знайти батьківський процес зомбі
У стовпці з повною командою у виводі ps зомбі показано як <defunct>, бо його програма вже завершилася. Розбиратися треба з батьківським процесом.
- Виконайте
ps -axo pid,ppid,stat,comm | awk '$3 ~ /^Z/', щоб побачити список зомбі. Літера Z у стовпці STAT позначає зомбі. - Запамʼятайте число в стовпці PPID.
- Виконайте
ps -p <PPID> -o pid,user,command, щоб побачити, яка програма є батьківською. - У Моніторі активності виберіть «Перегляд» > «Усі процеси, ієрархічно», щоб побачити те саме дерево батьківських і дочірніх процесів.
- Розберіться з батьківським процесом. Якщо це програма, яку ви відкривали, завершіть і знову відкрийте її. Якщо це оболонка чи скрипт у Терміналі, закрийте те вікно або зупиніть скрипт. Якщо це системний процес, перезапустіть Mac.
Нормально чи тривожно
Батьківська програма забирає код завершення дочірнього процесу за допомогою системних викликів сімейства wait. Програма, яка запускає дочірні процеси, але ніколи не чекає на них, залишає по собі зомбі. Це помилка в батьківській програмі, і остаточно виправити її може лише розробник.
Бачити зомбі якусь мить — нормально. Він існує в проміжку між завершенням процесу й моментом, коли батьківський процес прочитає його код завершення, і зазвичай цей проміжок дуже короткий.
Варто придивитися, коли той самий батьківський процес тримає багато зомбі або їхня кількість зростає годинами. Щоб порахувати їх, виконайте ps -axo stat | grep -c '^Z'. Щоб побачити обмеження на кількість процесів на вашому Mac, виконайте sysctl kern.maxproc kern.maxprocperuid.
Зомбі, сироти й завислі процеси — це різні речі
Ці три терміни часто плутають, і кожен потребує свого рішення.
- Зомбі вже завершив роботу. Від нього лишився тільки запис у таблиці процесів.
- Сирота досі працює, але його батьківський процес завершився. macOS передає його launchd (PID 1), який стає його новим батьківським процесом.
- Завислий процес досі працює, але застряг, і в Моніторі активності його часто позначено як «не відповідає». На відміну від зомбі, його можна завершити або завершити примусово.
Чого не робити
У невеликій кількості зомбі нешкідливі, тож немає сенсу ризикувати, щоб їх прибрати.
- Не виконуйте
kill -9для PID зомбі. Він уже завершився, тож сигнал нічого не дасть. - Не завершуйте launchd чи інші системні процеси, щоб прибрати зомбі. Перезапуск зробить те саме безпечно.
- Не завершуйте батьківський процес, не перевіривши, що це. Якщо це програма з відкритими документами, спершу збережіть роботу.
Що питають люди
Що таке процес-зомбі на Mac?
Це процес, який завершився, але досі є в списку, бо його батьківський процес не забрав код завершення. Він не використовує процесор.
Як завершити процес-зомбі?
Безпосередньо — ніяк. Завершіть або перезапустіть його батьківський процес, указаний у стовпці PPID у виводі ps, і зомбі зникне.
Чи шкідливі процеси-зомбі?
Кілька — ні. Кожен займає місце в таблиці процесів, тож велика кількість, що зростає, з часом може спричинити проблеми й вказує на помилку в батьківській програмі.
Чому kill -9 не може прибрати процес-зомбі?
Зомбі не працює, тож сигналу нема чого зупиняти. Прибрати його можна, лише якщо батьківський процес забере його код завершення або сам завершиться.
Чи прибирає перезапуск Mac процеси-зомбі?
Так. Перезапуск завершує всі процеси, зокрема зомбі та їхні батьківські процеси.
Чи є процеси-зомбі ознакою шкідливого ПЗ?
Ні. Це звичайна частина того, як завершуються процеси в Unix. Багато зомбі від одного батьківського процесу зазвичай означають, що в тій програмі є помилка.
Повʼязане
Покроково: Claude Code використовує забагато памʼяті.
Перейшли з Windows? Дивіться Диспетчер завдань для Mac або найкращі альтернативи Монітору активності. Або перегляньте усі терміни глосарію.