Ноћ вештица на Линуку: како убити зомби процесе

халловеен марка

Дан мртвих долази и зато желимо да направимо овај мали водич из ЛкА да разговарамо о зомби процеси и како их можемо убити. Прва ствар коју треба рећи је шта је зомби процес, а то је да као што знате, Линук кернел има подсистем за управљање процесима и ради са планером како би креирао, променио приоритет, послао или уклонио ток обраде ЦПУ-а и убијају процесе. Па, овај део језгра, као и остали Уник-слични системи, разликује различита стања процеса ...

Тако да то можемо наћи процес може бити у стању спавања (С), односно успаваном. Такође процеси у текућем стању (Р) који су они који се тренутно изводе или изводе, процеси који чекају (Д) који су заустављени чекајући да буду присутни, гестикулирани (Т) или суспендовани, а такође и зомбији (З) или преминули. Зомби или мртви процес је онај који је већ успешно окончан, али су отети одређени системски ресурси, јер га Линук још увек чува у табели процеса. Већ знате да када се процес завршава, он не би требало да остане у овом стању, већ се довршава и кернел ослобађа ресурсе тако да их други процеси могу користити, у основи ослобађа заузету РАМ меморију ...

Па, пошто није занимљиво имати ову врсту зомби процеса, иако они нису тако чести, можемо их тражити и елиминисати како је овде назначено. Прва ствар је да утврдимо да ли у нашој дистрибуцији постоје зомби процеси и за то можемо сами себи да помогнемо алати попут врха или попут пс. На пример, једна од ове две опције:

ps -el | grep 'Z'

ps aux | grep defunct

А једном откривени можемо убиј га директно са:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Иако је друга алтернатива проналажење надређених процеса, од до убити зомби процес Морате да убијете родитељске процесе који га одржавају, као што сте можда закључили:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Мораћете да замените по ИД зомби процеса који сте пронашли и да бисте га убили килл, користите ИД надређеног процеса који замењује у примеру очигледно.


Оставите свој коментар

Ваша емаил адреса неће бити објављена. Обавезна поља су означена са *

*

*

  1. Odgovorni za podatke: AB Internet Networks 2008 SL
  2. Сврха података: Контрола нежељене поште, управљање коментарима.
  3. Легитимација: Ваш пристанак
  4. Комуникација података: Подаци се неће преносити трећим лицима, осим по законској обавези.
  5. Похрана података: База података коју хостује Оццентус Нетворкс (ЕУ)
  6. Права: У било ком тренутку можете ограничити, опоравити и избрисати своје податке.

  1.   правили лопте дијо

    Добар сајт!
    Увек нас извлаче из невоље.

    Где каже:
    Иако је друга алтернатива пронаћи родитељске процесе, пошто да бисте убили зомби процес морате убити родитељске процесе који га подржавају, као што сте можда закључили:

    1 | пс -ео пид, ппид | греп
    2|
    3 | убити -9

    Мораћете да замените ИД зомби процеса који сте пронашли и да бисте га убили са килл, користите ИД родитељског процеса који замењује у примеру, очигледно.

    можете додати скрипту:

    $ цат киллппид.сх
    #! / бин / басх
    килл -9 $ (пс -ео пид, ппид | авк '$ 1 ==' $ {1} '{принт $ 2}')

    Наравно, то није задатак који обичан корисник обавља све време.
    Било би корисно само за администратора, али је опасно покренути га као роот, јер може убити било који процес на систему.

    У убиству човека има ову ноту:

    НАПОМЕНЕ Ваша шкољка (интерпретатор командне линије) можда има уграђену команду за укидање. Можете
    потребно је да покренете команду описану овде као / бин / килл да бисте решили конфликт.

    Басх има ту команду, ово је део ман басх о томе:

    убити [-с сигспец | -н ​​сигнум | -сигспец] [пид | јобспец] ...
    убити -л | -Л [сигспец | излаз_статус]
    Пошаљите сигнал назван по сигспец или сигнум процесима именованим по пид или посао
    спец. сигспец је или име сигнала без обзира на велика и мала слова као што је СИГКИЛЛ (са или
    без префикса СИГ) или сигналног броја; сигнум је сигнални број. Ако
    сигспец није присутан, онда се претпоставља СИГТЕРМ. Аргумент -л наводи
    имена сигнала. Ако се дају било који аргументи када је дато -л, имена
    сигнали који одговарају аргументима су наведени, а статус повратка је 0.
    Аргумент екит_статус за -л је број који специфицира или број сигнала или
    излазни статус процеса који је прекинут сигналом. -Л опција је еквивалентна
    посуђен на -л. килл враћа труе ако је бар један сигнал успешно послат, или
    нетачно ако дође до грешке или се наиђе на неважећу опцију.

    На почетку објашњавају како басх штити процесе, да би се избегли неки проблеми, али није ми јасно како да направим безбедну скрипту за покретање као роот.
    Једина ствар коју могу да смислим је да је заштитим овако:

    $ цат киллппид.сх
    #! / бин / басх
    ако [$ УСЕР == "роот"]
    онда ецхо Не покрени $ 0 као роот !!! опасно је!
    излаз
    fi

    килл -9 $ (пс -ео пид, ппид | авк '$ 1 ==' $ {1} '{принт $ 2}')

    $

    Користите басх килл, а не / бин / килл

    Како видите да нисам баш добро упућен у басх.
    Да ли знате како да напишете безбедну скрипту која се покреће као корисник подређеног процеса, чак и ако се покреће као роот?
    нешто еквивалентно ономе што би се урадило ручно овако:

    $ су;
    $ килл -9 $ (пс -ео пид, ппид | авк '$ 1 ==' $ {1} '{принт $ 2}')