Зомби процесът в Linux се отнася до тези вече мъртви процеси, но по един или друг начин все още присъстват в таблицата с процеси на системата. Вратичката е, че по някаква причина този процес не е почистен от родителя от таблицата на процесите. Обикновено това се случва след приключване на процеса на изпълнение.
Обичайният начин на работа в Linux е, че след като процесът завърши изпълнението си, той уведомява своя родител, който е отговорен за премахването на процеса от таблицата. За съжаление родителят не може да премахне процеса от паметта в случаите, когато родителят не може да прочете състоянието на детето. Ето как се получава така, че в таблицата с процеси имаме мъртви процеси. Това са нещата, които наричаме зомби процеси.
Какво причинява Linux Zombie процеси?
Когато дъщерният процес е създаден, зле написаният родителски процес може да не успее да извика функцията wait (). В резултат на това децата му зомбита ще останат в паметта, докато не бъдат изгасени.
Това означава, че нищо не наблюдава детския процес за промени в състоянието и сигналът SIGCHLD ще бъде игнориран. Може би друго приложение пречи на изпълнението на родителския процес, било чрез лошо програмиране или злонамерено намерение.
Правилното домакинство на системата няма да се случи, ако родителският процес не следи за промени в състоянието в дъщерния процес.
Когато процесът на бебето приключи, PCB и записът в таблицата на процесите няма да бъдат премахнати. В резултат на това състоянието на зомбито никога не се премахва от печатната платка.
Зомбитата имат малко памет, но обикновено това не е проблем. Тъй като системите на Linux имат ограничен брой PID (макар и голям брой), ако се зомбират достатъчно PID, никой друг процес не може да започне. Съмнително е това да се случи.
Зомбираните процеси обаче предполагат, че нещо се е объркало с дадено приложение и че определена програма може да има грешка.
Софтуерните грешки в центровете за данни не трябва да се толерират и трябва да бъдат отстранени.
Трябва да наблюдавате и унищожавате зомби процеси, докато грешката не бъде отстранена.
Идентификаторът на процеса не може да се използва повторно, докато не бъде стартиран, така че записът в таблицата на процеса е малък.
Тъй като печатната платка е много по-голяма от записа в таблицата с процеси в 64-битова операционна система, това е малко вероятно да създаде проблеми.
Обемът памет, наличен за други процеси, може да бъде повлиян от голям брой зомбита. Ако обаче имате толкова много зомбита, имате сериозен проблем с родителското приложение или грешка в операционната система.
И така, какво правите, когато една процедура се превърне в зомби? Вие проследявате и премахвате зомби процесите.
Как да намерим зомби процес?
Първоначалното спиране на убиването на зомби процес в системата е първо да го идентифицирате. Тъй като процесът на init се почиства редовно след зомбита, всичко, което трябва да направите, за да се отървете от тях, е да унищожите процеса, който ги е създал.
Най-горната команда е бърз начин да видите дали във вашия район има зомбита. За да постигнем това, ще изпълним следната команда.
Горна част
Броят на зомби процесите в тази система ще бъде показан на изхода. В нашия случай по-горе имаме 0 зомбита.
С помощта на командата ps и прекарването й в egrep можем да получим списък с тях. Държавният флаг за зомби процеси е „Z“, а понякога ще видите и „несъществуващ“.
tuts @ fosslinux: ~ $ ps aux | egrep "Z | несъществуващ"
Нека разбием различните раздели на тази команда.
Z в колоната STAT на изхода идентифицира процес на зомбиране.
[defunct] в последната (COMMAND) колона на изхода също идентифицира зомби процес.
В идеалния случай не е възможно да се убие процес на зомби, защото той е мъртъв. Вместо това уведомяваме родителя да опита и прочете състоянието на процеса на детето и накрая да ги изчисти от таблицата на системата. За да задействаме този процес, ние изпращаме сигнал SIGCHLD до родителя на процеса. Идентифицирането на идентификатора на родителския процес или това, което се нарича PID, включва изпълнение на следната команда:
tuts @ fosslinux: ~ $ ps -o ppid =
След като получите PID на зомбито, използвайте командата SIGCHLD сигнал за предварително идентифицираните родителски процеси.
tuts @ fosslinux: ~ $ kill -s SIGCHLD
В някои случаи това не изяснява процеса на зомбиране. Това ни призовава да се включим в план б или в. Предишното включва рестартиране на родителския процес или убиване на родителските процеси. От друга страна, последните случаи включват извършване на рестартиране на системата, особено когато процесът на зомби може да причини прекъсване или масивен скок поради процеса на зомбито.
По-долу е командата за убиване на родителския процес.
tuts @ fosslinux: ~ $ kill -9
В случай, че родителски процес бъде убит, като разширение, всички дъщерни процеси на дадения родител също се убиват. В случай, че един от дъщерните процеси е критичен в дадения момент, може да се наложи да отложите убийството, докато стане безопасно. От друга страна, бързата двойна проверка може да ви каже колко памет или процесорна мощ консумират процесите на Zombie. Това помага да се определи дали по-добрият вариант е да убиете родителския процесор, за да направите рестартиране на системата в следващия цикъл на поддръжка на системата, който вече е насрочен.
В Linux как работят състоянията на процесите?
Разбира се, Linux трябва да следи всички приложения и демони, работещи на вашия компютър. Поддържането на таблицата с процеси е един от начините, по които се постига това.
Това е списък на структурите на паметта на ядрото. Този списък включва запис за всеки процес, който съдържа известна информация за него. Всяка от структурите на таблицата с процеси съдържа много малко информация.
Те съхраняват идентификатора на процеса, няколко други части информация и указател към контролния блок на процеса (PCB).
PCB е мястото, където Linux съхранява цялата информация, която е необходима за търсене или настройка за всеки процес. Тъй като процесът се създава, той се модифицира, дава му време за обработка и след това се унищожава.
На PCB на Linux има над 95 полета. Той е дефиниран в структурата на задачите, която е с дължина над 700 реда. Следните видове информация могат да бъдат намерени на печатната платка:
Състоянията на процеса са илюстрирани по-долу
- Номер на процеса: Отличителният идентификатор на операционната система.
- Брояч на програми: Когато този процес получи отново достъп до процесора, системата ще използва този адрес, за да намери следващата инструкция на процеса, който трябва да бъде изпълнен.
- Регистри: Тази процедура използва списък на регистрите на процесора, наречени регистри. Акумулатори, индексни регистри и указатели на стека могат да бъдат включени в списъка.
- Open File List: Файловете, свързани с тази процедура, са включени в Open File List.
- Информация за планиране на процесора: Използва се за изчисляване колко често и за колко време този процес получава време за обработка на процесора.
ПХБ трябва да записва приоритета на процеса, указатели към опашки за планиране и други параметри за планиране. - Информация за управление на паметта: Информация за паметта, която използва този процес, като начален и краен адрес на паметта на процеса, както и указатели към страници с памет.
- Информация за състоянието на I / O: Всички устройства, които процесът използва като входове или изходи.
Всяко от следните може да бъде „състояние на процеса“:
- R: Изпълняващ се или изпълним процес. Работи, което означава, че получава и изпълнява цикли на процесора.
Процедура, която е готова за изпълнение, чака слот за процесор. - П: Актът на спане.
Процесът очаква завършване на действие, като операция за въвеждане или извеждане. Или наличност на ресурс. - D: Процедурата е в състояние на непрекъсваем сън. Той използва блокиращ системен разговор, което означава, че няма да продължи, докато системните повиквания не бъдат завършени. За разлика от състоянието “Sleep”, процес в това състояние няма да реагира на сигнали, докато системното повикване не бъде завършено и изпълнението не се върне в процеса.
- T: Тъй като получи сигнала SIGSTOP, процесът приключи (спря).
Той ще реагира само на сигналите SIGKILL или SIGCONT, или убивайки, или инструктирайки процеса да продължи. Когато превключите от задачи от преден план (fg) към фонови (bg), това се случва. - Z: означава Zombie Process. Когато процесът приключи, той не просто изчезва. Вместо това освобождава всяка памет, която използва в момента, и излиза от паметта, но влизането в таблицата на процесите и печатната платка остават.
Състоянието му е настроено на EXIT ZOMBIE и на родителския процес се казва, че процесът на бебето е завършен чрез сигнала SIGCHLD.
Заключение
Освен ако не са част от огромна орда, зомбитата не са толкова вредни. Няколко не са голяма работа и бързото рестартиране ще ги изчисти. Има обаче един момент, който трябва да се има предвид.
Linux архитектурите имат максимален брой процеси и в резултат на това максимален брой идентификационни номера на процеси. Когато се постигне максимален брой зомби процеси на компютъра, нови процеси не могат да бъдат стартирани.
Зомби процесите не са процеси; те са остатъците от мъртви процеси, които техният родителски процес не е изчистил правилно. Ако обаче забележите, че определено приложение или процес постоянно раждат зомбита, трябва да проучите допълнително.
Най-вероятно това е просто лошо написана програма; в този случай може би има актуализирана версия, която се изчиства, след като нейното дете обработи правилно.