Начална » как да » Какво е “зомби процес” на Linux?

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

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

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

    Кредит за снимката: Даниел Холистър на Flickr (ремиксиран)

    Какво е Зомби процес?

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

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

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

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

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

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

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

    Първи отървете от зомби процеси

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

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

    убива SIGCHLD pid

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

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