Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: Apache в Oct 23, 2005, 00:36



Титла: Програма за убиване на зомбирани процеси
Публикувано от: Apache в Oct 23, 2005, 00:36
Здравейте, трябва ми някоя програма за убиване на зомбирани процеси под Gentoo. Ако някой се сеща, моля да ми каже. Мерси предварително !


Титла: Програма за убиване на зомбирани процеси
Публикувано от: loxs в Oct 23, 2005, 00:41
Хех, там нямате ли top?... или kill, killall... ?


Титла: Програма за убиване на зомбирани процеси
Публикувано от: Apache в Oct 23, 2005, 01:04
Говоря за някакъв скрипт, който постоянно да следи.


Титла: Програма за убиване на зомбирани процеси
Публикувано от: romeo_ninov в Oct 23, 2005, 07:32
Цитат (Apache @ Окт. 23 2005,01:36)
Здравейте, трябва ми някоя програма за убиване на зомбирани процеси под Gentoo. Ако някой се сеща, моля да ми каже. Мерси предварително !

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


Титла: Програма за убиване на зомбирани процеси
Публикувано от: aaaaaa в Oct 23, 2005, 08:02
И аз с това впечатление останах. За около 6 месеца ползване на убунту два пъти ми се случи процеси да останат зомбирани за дълго време и се отървах като рестартирах.


Титла: Програма за убиване на зомбирани процеси
Публикувано от: loxs в Oct 23, 2005, 09:14
Хъх... в единствения случай, когато имах такъв процес си го у трепах през топ като едното нищо  ???


Титла: Програма за убиване на зомбирани процеси
Публикувано от: romeo_ninov в Oct 23, 2005, 10:12
Цитат (loxs @ Окт. 23 2005,10:14)
Хъх... в единствения случай, когато имах такъв процес си го у трепах през топ като едното нищо  ???

Поне в света на Юникс зомби процес се получава при спиране на процес с някакъв сигнал и след това изпоращане към него на друг сигнал. В такъв случай някои от приложенията изпадат в неопределено състояние от което няма излизане. Заема се малко памет за файлов указател (и евентуално алокирана от процеса памет) и процесорно време (малко) за разпознаване на процеса като зомби и преминаване нататък по кръга от процеси. АКо броя на процесите-зомби е голям е препоръчително да се рестартира машината заради възможни проблеми с производителността (говорим за десетки и стотици). В твоя случай вероятно си имал късмет или процеса не е бил изцяло зомби


Титла: Програма за убиване на зомбирани процеси
Публикувано от: danchev в Oct 23, 2005, 11:24
Чета аз и на очите си не вярвам ... как може да падне качеството на коментарите тук до такова ниво.

Зомби (zombie) процеси в Юникс са дъщерни процеси които са приключили своята работа и са уведомили ядрото за това, обаче техния родител(и) (който в момента изпълнява wait() или waitpid() или + нещо подобно) не се е погрижил все още да им вземе exit status-а от ядрото. Зомби процесите НЕ заемат никакър ресурс освен PID ентри, което ядрото не може да освободи защото само чрез него евентуално родителя ще поиска (някога ако въобще ще) exit status-а на детето. Зомби процес се убива (освобождава PID-a) като се убие неговия родител със сигнал (-15 най-културно, -9 най-грубо, ще ги видите). Ако и родителя exit()-не без да е взел exit() статуса на децата си то работа на процеса init е да wait()-ва такива зомби процеси, така, че можете да пратите и HUP до init, не можете да го убиете защото той е пуснат от ядрото нищо че е зачислен на root. Рестартиране на системата е силно безмислено... най-малко пък заради производителността. Смех.

За домашно: разберете какво е orphan process (сирак).


Титла: Програма за убиване на зомбирани процеси
Публикувано от: loxs в Oct 23, 2005, 11:37
Ами и аз имах горе-долу същата представа за нещата... и затова ми беше доста странно защо тази тема предизвиква такава паника :)

А за сираците... знам само че са нещо лошо... ама сегичка ще се поразровя из уикипедия.


Титла: Програма за убиване на зомбирани процеси
Публикувано от: divak в Oct 23, 2005, 18:26
Всеки процес в *NIX има "потребителска"(когато се изпълнява програмата) и "системна"(когато след системно извикване или прекъсване се изпълнява процедура на ядрото) фаза, като двете фази на процеса се не се изпълняват едновременно, а строго последователно(системната е продължение на потребителската).Системното извикване "fork" създава нов процес със състояние "initial". След пълното му създаване процесът преминава в състояние на готовност .Ако готов процес бъде избран за изпълнение, извиква се процедурата "switch", която предава управлението на процеса, който започва да се изпълнява в режим на ядрото"kernel running". По-нанатък действията зависят от предишните състояния на процеса.Ако процесът е новосъздаден или е потребителски, веднага минава в състояние "user running" и се изпълнява в потребителски режим.Ако по време на изпълнение на системно извикване процесът е бил блокиран поради липса на ресърс,въстановява се изпълнението на извикването в "kernel running".Когато се изпълнява в потребителски режим , процес може да премине в "kernel running" при прекъсване или иницииране на системно извикване и след изпълнението му да се върне обратно, като по време на системното извикване е възможно той да трябва да ресурс или събитие (това се извършва със извикване на процедурата "sleep", която поставя процеса в опашка от "спящи" процеси и състояние "asleep", когато ресурсът се освободи или събитието настъпи , ядрото"събужда" процеса със "wakeup" ).
Процес може да бъде преустановен със сигнал "stop"(SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU). Сигнала променя веднага състоянието на процеса , в зависимост от текущото състояние той преминава в състояние "stopped" или "asleep". Състоянието на процеса може да се възобнови чрез сигнал "continue"(SIGCONT), който го връща в състояние "ready to run" или "asslep". И накрая, когато процес завърши изпълнението си чрез извикване  на "exit" (или получаване на сигнал), ядрото освобождава ресурсите му (с изключение на статуса и данните за използваните ресурси) и го поставя "zombie". Процесът остава в това състояние, докато родителят му не извика системно извикване "wait"(waitpid), което унищожава процеса и връща статуса му на родителя.

Извинявам се че почнах толкова от далеко  ;)   Мисля че отговора на домашното е някъде там  ;)


Титла: Програма за убиване на зомбирани процеси
Публикувано от: divak в Oct 23, 2005, 18:36
А за въпроса със скрипта, то той би трябвало да е нещо то сорта:
1.чете таблицата със процесите
2.проверява във EVENT за процес със флаг Z
3.трепе процеса
Или нещо подобно  ???

Например използвайки това : ps hr -Nostate,pid + малко bash цялата мъка се решава с няколко реда  ;)


Титла: Програма за убиване на зомбирани процеси
Публикувано от: loxs в Oct 23, 2005, 20:59
Еха, ако всички теми се развиваха така, както тази... скоро ще станем доста добри :)
Аз ще си призная, че така и не рових да търся за сираците (към обяд излязох и се прибрах току-що.

Да разбирам ли, че сирак е зомби, което не е умряло след "wait", при което родителят му губи контрол над него и след това сиракът си прави каквото си знае...? Дам, ще се ровя май :)

Горното обаче лекичко си противоречи с едно определение от книгата "Slackware Linux Essentials" в което кратичко се казва: "A Zombie is a process whose parent has died...."
В смисъл, как родителят ще му прати сигнал "wait", ако е умрял :)

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


Титла: Програма за убиване на зомбирани процеси
Публикувано от: danchev в Oct 23, 2005, 21:24
Това дето са написали в "Slackware Linux Essentials" е пълна глупост, то там повечето неща са пълни бъркочи. Иначе е безкрайно лесно да попиташ google например...

http://www.elook.org/computing/zombie-process.htm
http://www.elook.org/computing/orphan-process.htm

http://en.wikipedia.org/wiki/Zombie_process
http://en.wikipedia.org/wiki/Orphan_process

http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?zombie+process
http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?orphan+process

От zombie може да стане *и* orphan, но ако е бил orphan и не е бил zombie, няма как да стане zombie после, защото init го осиновява. Това го написах още първия път де.


Титла: Програма за убиване на зомбирани процеси
Публикувано от: loxs в Oct 23, 2005, 21:31
Анаех си аз, че има някаква далавера :)
Ужас, Инит забременя  :D

Благодаря за линковете, аз тъкмо се готвех да давам такива от Уикипедия :)


Титла: Програма за убиване на зомбирани процеси
Публикувано от: danchev в Oct 23, 2005, 21:40
Аааа това дето си написал "В смисъл, как родителят ще му прати сигнал "wait"" също е глупост, но си извинен защото не поучаваш хората с измислици, като някои други псевдо Юникс гурута в единични кавички, а питаш ;-) ... wait() не е сигнал, а системно извикване [1] което се изпълнява от родителя. Той може да бъде "подсетен" да си ожъне зомбиралото дете например чрез пратен му е теб сигнал  
-17 SIGCHLD.

man wait, waitpid,
kill -l за наличните сигнали.
[1] http://en.wikipedia.org/wiki/System_call


Титла: Програма за убиване на зомбирани процеси
Публикувано от: loxs в Oct 23, 2005, 23:42
Знам, знам, неведнъж съм си омазвал системата с игрички с kill i top :)


Титла: Програма за убиване на зомбирани процеси
Публикувано от: divak в Oct 24, 2005, 00:28
Ето малко зомби (безвредно) за тренировка
Примерен код
#include <stdlib.h>

void main(void) {
   int pid;

   printf("Parent's pid is %d\n", getpid());
   if ((pid = fork()) > 0) { /* Parent */
      while (1) sleep(10); /* Sit around */
   } else {  /* Child */
      sleep(1);
      printf("Child %d exiting\n", getpid());
      exit;
   }
}


ако незастреляш Parent процеса няма отърване  :D


Титла: Програма за убиване на зомбирани процеси
Публикувано от: mlinux_gada в Nov 23, 2005, 13:40
Linux се рестартира само когато се СЛАГА,МАХА,ДОБАВЯ хардуер...Или за слагане на нов kernel,ако е прекалено наложително :( .Една малка :) разлика м/у Win и Linux е, че ако някоя програма(или нещо от сорта) забие(т.е. не функционира),НЕ СЕ НАЛАГА рестарт, както е при бозата(!;)