Научете Linux

Как да убивам зомби процеси в Linux

Как да убивам зомби процеси в Linux

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

Обичайният начин на работа в Linux е, че след като процесът завърши изпълнението си, той уведомява своя родител, който е отговорен за премахването на процеса от таблицата. За съжаление родителят не може да премахне процеса от паметта в случаите, когато родителят не може да прочете състоянието на детето. Ето как се получава така, че в таблицата с процеси имаме мъртви процеси. Това са нещата, които наричаме зомби процеси.

Какво причинява Linux Zombie процеси?

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

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

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

Когато процесът на бебето приключи, PCB и записът в таблицата на процесите няма да бъдат премахнати. В резултат на това състоянието на зомбито никога не се премахва от печатната платка.

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

Зомбираните процеси обаче предполагат, че нещо се е объркало с дадено приложение и че определена програма може да има грешка.
Софтуерните грешки в центровете за данни не трябва да се толерират и трябва да бъдат отстранени.
Трябва да наблюдавате и унищожавате зомби процеси, докато грешката не бъде отстранена.

Идентификаторът на процеса не може да се използва повторно, докато не бъде стартиран, така че записът в таблицата на процеса е малък.
Тъй като печатната платка е много по-голяма от записа в таблицата с процеси в 64-битова операционна система, това е малко вероятно да създаде проблеми.

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

И така, какво правите, когато една процедура се превърне в зомби? Вие проследявате и премахвате зомби процесите.

Как да намерим зомби процес?

Първоначалното спиране на убиването на зомби процес в системата е първо да го идентифицирате. Тъй като процесът на init се почиства редовно след зомбита, всичко, което трябва да направите, за да се отървете от тях, е да унищожите процеса, който ги е създал.

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

Горна част

резултати от най-горната команда

Броят на зомби процесите в тази система ще бъде показан на изхода. В нашия случай по-горе имаме 0 зомбита.
С помощта на командата ps и прекарването й в egrep можем да получим списък с тях. Държавният флаг за зомби процеси е „Z“, а понякога ще видите и „несъществуващ“.

tuts @ fosslinux: ~ $ ps aux | egrep "Z | несъществуващ"

Държавният флаг за зомби процеси е Z или несъществуващ

Нека разбием различните раздели на тази команда.

Z в колоната STAT на изхода идентифицира процес на зомбиране.
[defunct] в последната (COMMAND) колона на изхода също идентифицира зомби процес.

В идеалния случай не е възможно да се убие процес на зомби, защото той е мъртъв. Вместо това уведомяваме родителя да опита и прочете състоянието на процеса на детето и накрая да ги изчисти от таблицата на системата. За да задействаме този процес, ние изпращаме сигнал SIGCHLD до родителя на процеса. Идентифицирането на идентификатора на родителския процес или това, което се нарича PID, включва изпълнение на следната команда:

tuts @ fosslinux: ~ $ ps -o ppid = 

Идентифициране на идентификатора на родителския процес

След като получите PID на зомбито, използвайте командата SIGCHLD сигнал за предварително идентифицираните родителски процеси.

tuts @ fosslinux: ~ $ kill -s SIGCHLD 

използвайте командата SIGCHLD сигнал

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

По-долу е командата за убиване на родителския процес.

tuts @ fosslinux: ~ $ kill -9 

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

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

В Linux как работят състоянията на процесите?

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

Те съхраняват идентификатора на процеса, няколко други части информация и указател към контролния блок на процеса (PCB).

PCB е мястото, където Linux съхранява цялата информация, която е необходима за търсене или настройка за всеки процес. Тъй като процесът се създава, той се модифицира, дава му време за обработка и след това се унищожава.

На PCB на Linux има над 95 полета. Той е дефиниран в структурата на задачите, която е с дължина над 700 реда. Следните видове информация могат да бъдат намерени на печатната платка:

Състоянията на процеса са илюстрирани по-долу

Всяко от следните може да бъде „състояние на процеса“:

Заключение

Освен ако не са част от огромна орда, зомбитата не са толкова вредни. Няколко не са голяма работа и бързото рестартиране ще ги изчисти. Има обаче един момент, който трябва да се има предвид.

Linux архитектурите имат максимален брой процеси и в резултат на това максимален брой идентификационни номера на процеси. Когато се постигне максимален брой зомби процеси на компютъра, нови процеси не могат да бъдат стартирани.

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

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

Как да използвам AutoKey за автоматизиране на Linux игри
AutoKey е програма за автоматизация на настолни компютри за Linux и X11, програмирана в Python 3, GTK и Qt. Използвайки неговата функционалност за скр...
Как да покажа брояч на FPS в игрите на Linux
Linux игрите получиха голям тласък, когато Valve обяви поддръжка на Linux за Steam клиент и техните игри през 2012 г. Оттогава много AAA и независими ...
Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...