If-Koubou

Какво е "зомби процес" на Linux?

Какво е "зомби процес" на Linux? (Как да)

Ако сте потребител на Linux, вероятно сте виждали процеси на зомбита, които се намират около вашия списък с процеси. Не можеш да убиеш зомби, защото вече е мъртъв - като истински зомби.

Зомбита са в основата остатъците от мъртви процеси, които не са били добре почистени. Програмата, която създава зомби процеси, не е програмирана правилно - програмите не трябва да позволяват на зомби процесите да се задържат.

Image Credit: Daniel Hollister на Flickr (ремиксиран)

Какво представлява процесът на зомби?

За да разберете какво е процесът на зомбита и какво причинява появата на зомби процеси, ще трябва да разберете малко за това, как процесите работят върху Linux.

Когато процесът умре на Linux, не всичко е изтрито от паметта незабавно - процесният дескриптор остава в паметта (дескрипторът на процеса взема само малко количество памет). Статусът на процеса става EXIT_ZOMBIE, а родителят на процеса е уведомен, че неговият детски процес е умрял с сигнала SIGCHLD. След това родителският процес трябва да изпълни системното повикване wait (), за да прочете изходното състояние на процеса на мъртва и друга информация. Това позволява на родителския процес да получи информация от мъртвия процес. След като изчакваме чакането (), процесът на зомбита се премахва напълно от паметта.

Това обикновено се случва много бързо, така че няма да видите какви зомби процеси се натрупват във вашата система. Въпреки това, ако родителският процес не е програмиран правилно и никога не се обажда (чакайте), децата му ще се задържат в паметта, докато не бъдат почистени.

Помощни програми като GNOME System Monitor, връх командата и к.с. командата показва зомби процеси.

Опасностите от зомби процеси

Процесите на зомбита не използват никакви системни ресурси. (Всъщност всяка от тях използва много малка част от системната памет, за да съхранява своя дескриптор на процеса.) Всеки процес на зомби обаче запазва идентификационния процес (PID). Линукс системите имат ограничен брой идентификатори на процесите - 32767 по подразбиране за 32-битови системи. Ако зомбита се натрупват с много бърза скорост - например, ако неправилно програмираният сървър на софтуер създава зомби процеси под натоварване - целият пул от налични PIDs ще бъде присвоен на зомби процеси, предотвратявайки стартирането на други процеси.

Въпреки това, няколко зомби процеси, висящи наоколо, не представляват проблем - макар че те показват, че в системата ви има проблем с родителския процес.

Да се ​​отървете от зомби процеси

Не можете да убивате зомби процеси, тъй като можете да убивате нормални процеси със сигнала SIGKILL - процесите на зомбита вече са мъртви. Имайте предвид, че не е нужно да се отървете от зомби процеси, освен ако не разполагате с голяма сума на вашата система - няколко зомбита са безобидни. Въпреки това, има няколко начина да се отървете от зомби процеси.

Един от начините е изпращането на сигнала SIGCHLD към родителския процес. Този сигнал указва на родителския процес да изпълни системното повикване wait () и да изчисти своите деца с зомби. Изпратете сигнала с убивам команда, замяна PID в командата по-долу с PID на родителския процес:

убий-s SIGCHLD pid

Ако обаче родителският процес не е програмиран правилно и игнорира SIGCHLD сигналите, това няма да помогне. Ще трябва да убиете или да затворите родителския процес на зомбита. Когато процесът, който създава зомбита, завършва, init наследява процесите на зомбита и става нов родител. (init е първият процес, стартиран на Linux при зареждане и е назначен за PID 1.) init периодично изпълнява системното повикване wait () за да изчисти своите зомби деца, така че init ще направи кратка работа на зомбита. Можете да рестартирате родителския процес след затварянето му.

Ако родителският процес продължава да създава зомбита, той трябва да бъде фиксиран така, че правилно да изчаква () да пожъне своите деца с зомбита. Задайте отчет за грешка, ако дадена програма на вашата система продължава да създава зомбита.