Halloween Linuxon: hogyan lehet megölni a zombi folyamatokat

halloween bélyegző

Közeledik a halottak napja, ezért szeretnénk elkészíteni ezt a kis oktatóanyagot az LxA-tól, hogy beszéljünk a zombi folyamatok és hogyan ölhetjük meg őket. Az első mondandó az, hogy mi a zombi folyamat, és ez az, hogy mint tudják, a Linux kernel rendelkezik egy alrendszerrel a folyamatok kezelésére, és az ütemezővel együttműködve létrehozza, megváltoztatja a prioritást, elküldi vagy eltávolítja a CPU feldolgozási folyamatát ölési folyamatok. Nos, a kernel ezen része, a többi Unix-szerű rendszerhez hasonlóan, megkülönbözteti a folyamatok különböző állapotait ...

Tehát megtalálhatjuk egy folyamat lehet alvó (S) állapotban, vagyis alszik. Szintén folyamatban lévő folyamatok (R), amelyek jelenleg futnak vagy futnak, várakozási folyamatok (D), amelyek leálltak a részvételre várakozással, gestpt (T) vagy felfüggesztettek, valamint a zombik (Z) vagy elhunytak. A zombi vagy halott folyamat olyan, amelyet már sikeresen befejeztek, de bizonyos rendszererőforrásokat eltérítettek, mivel a Linux még mindig a folyamattáblába menti. Már tudja, hogy amikor egy folyamat véget ér, akkor nem ebben az állapotban kell maradnia, hanem befejeződik, és a kernel felszabadítja az erőforrásokat, hogy más folyamatok is felhasználhassák őket, alapvetően felszabadítja a foglalt RAM-ot ...

Nos, mivel nem érdekes, hogy ilyen típusú zombi folyamatok vannak, bár ezek nem olyan gyakoriak, megkereshetjük és kiküszöbölhetjük őket, ahogy itt jeleztük. Az első dolog az, hogy megtudjuk, vannak-e zombi folyamatok a disztribúciónkban, és ehhez tudunk segíteni magunkon olyan eszközök, mint a felső vagy a ps. Például a két lehetőség egyikét:

ps -el | grep 'Z'

ps aux | grep defunct

És miután észleltük, megtehetjük Öld meg közvetlenül:

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

Bár egy másik alternatíva a szülői folyamatok megtalálása, azóta megöl egy zombi folyamatot Meg kell ölnöd az azt fenntartó szülői folyamatokat, amint arra következtethetsz:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Ki kell cserélni a megtalált zombi folyamat azonosítója alapján, és öléssel megöli, használja a szülő folyamat azonosítóját a példában nyilván.


Hozzászólás, hagyd a tiedet

Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: AB Internet Networks 2008 SL
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.

  1.   golyókat készített dijo

    Jó oldal!
    Mindig kihoznak minket a bajból.

    Ahol ez áll:
    Bár egy másik alternatíva a szülő folyamatok megkeresése, mivel egy zombi folyamat megöléséhez meg kell ölni az azt támogató szülő folyamatokat, amint arra következtethetett:

    1 | ps -eo pid, ppid | grep
    2|
    3 | megölni -9

    A talált zombi folyamat azonosítóját be kell cserélni, és kill-vel kell megölni, természetesen a példában helyettesítő szülőfolyamat azonosítóját kell használni.

    hozzáadhatod a szkriptet:

    $ macska killppid.sh
    #! / bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Természetesen ez nem egy olyan feladat, amelyet egy normál felhasználó végez állandóan.
    Ez csak az adminisztrátornak lenne hasznos, de veszélyes root-ként futtatni, mert bármilyen folyamatot megölhet a rendszeren.

    Az emberölésben ez a megjegyzés szerepel:

    MEGJEGYZÉSEK A shell (parancssori értelmező) tartalmazhat beépített kill parancsot. Te talán
    Az ütközés megoldásához le kell futtatnia az itt leírt / bin / kill parancsot.

    Bashnak van ez a parancsa, ez a man bash része:

    megöl [-s sigspec | -n signum | -sigspec] [pid | munkaleírás] ...
    kill -l | -L [sigspec | kilépési_állapot]
    Küldje el a sigspec vagy signum által elnevezett jelet a pid vagy job által elnevezett folyamatokhoz
    spec. A sigspec egy kis- és nagybetűket nem érzékeny jelnév, például SIGKILL (a vagy
    SIG előtag nélkül) vagy jelszám; A signum egy jelszám. Ha
    sigspec nincs jelen, akkor a SIGTERM feltételezhető. A -l argumentuma felsorolja a
    jelek nevei. Ha bármilyen argumentumot megadunk, amikor -l van megadva, akkor az a neve
    az argumentumoknak megfelelő jelek listája, a visszatérési állapot pedig 0.
    Az -l-hez tartozó exit_status argumentum egy szám, amely vagy jelszámot, vagy jelszámot ad meg
    egy jellel lezárt folyamat kilépési állapota. Az -L opció egyenértékű
    kölcsönzött -l. kill értéke igaz, ha legalább egy jelet sikeresen elküldtek, vagy
    false, ha hiba történik, vagy érvénytelen opciót találunk.

    Az elején elmagyarázzák, hogy a bash hogyan védi a folyamatokat, hogy elkerüljem a problémákat, de nem világos számomra, hogyan tudnék rootként futni egy biztonságos szkriptet.
    Az egyetlen dolog, ami eszembe jut, az az, hogy így védjem meg:

    $ macska killppid.sh
    #! / bin / bash
    if [$ USER == "root"]
    akkor echo Ne futtasd a $ 0-t rootként !!! ez veszélyes!
    kijárat
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Használja a bash killt, ne a / bin / killt

    Hogy látod, nem vagyok túl jártas a bash-ban.
    Tudja, hogyan kell biztonságos szkriptet írni, amely a gyermekfolyamat felhasználójaként fut, még akkor is, ha rootként fut?
    valami, ami egyenértékű azzal, amit manuálisan végeznének, például:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')