Bash folyamat leállítási hackek – CloudSavvy IT

Avatar admin | 2021.01.30. 13 Views 0 Likes 0 Ratings

13 Views 0 Ratings Rate it

Bash Shell

A többszálas Bash-kód fejlesztésekor, a kiszolgálói folyamatok kezelésénél vagy a folyamatőrzők létrehozásakor az egyik fő kihívás általában a meglévő Bash-folyamatok helyes, hatékony és pontos befejezése. Ez a cikk megmutatja, hogyan.

Mi az a Bash folyamat?

A Bash folyamat egyszerűen futó futtatható fájl. Például amikor elindítja a számológépet az asztali környezetben, létrejön egy Bash folyamat. Egy ilyen bash-nak két fő folyamatazonosítója van, mégpedig a PID és a PPID, az Folyamatazonosító, és a Szülői folyamat azonosítója.

Összefoglalva, a PID számos alapú egyedi azonosítóval rendelkezik egy adott futó alkalmazáshoz (azaz a folyamathoz), míg az PPID bármely adott futó alkalmazás (azaz folyamat) tárolja a Szülő PID az új alkalmazást elindító folyamat, ezért a „Szülő” kifejezés.

Azonnal láthatja, hogy ez hogyan hoz létre egy faszerű struktúrát, összekapcsolva az összes folyamatot a gyökér / első folyamatig, amelynek van egy PPID 0-ról.

Gyökérfolyamatok Linuxon

Egy kapcsolódó cikkhez, amely további betekintést és gyakorlati példát nyújt PID és PPID, érdemes áttekinteni a mi oldalunkat Változók exportálása a Bash-ban: a Miért és hogyan cikk.

A Bash folyamatkezelés első látásra egyszerűnek tűnik (egyszerűen futtassa ps -ef a terminál parancssorán, hogy megtekinthesse a rendszeren futó összes folyamatot, azok előtagjával PID és PPID azonosítók.

A folyamat leállítása is egyszerűnek tűnik, de hamarosan a figyelmeztetések és a visszajelzések elkezdődnek, amikor összetettebb folyamatkezelő rendszereket kezel.

Bash folyamat leállítása

Kezdjük egyszerûen a gnome-calculator a parancssorban, és ezt követően befejezi a folyamatot.

gnome-calculator &
ps -ef | grep gnome-calculator
kill -9 $RELEVANT_PID

Egyszerű folyamatölés Linux alatt

Elkezdtük gnome-calculator háttér módban (a & a parancs végén), hogy a terminál parancssorunkat azonnal visszakaphassuk anélkül, hogy újabb terminál munkamenetet kellene indítanunk.

Ezután használtuk ps -ef csővel kombinálva (|) és a grep parancs a folyamatazonosító megkeresésére (PID). Ezután egy 9 jelzéssel szüntettük meg kill parancs. Cserélje ki $RELEVANT_PID a kódban a PID által jelentett ps ha megpróbálja ezt a kódot.

Ne feledje, hogy a háttérfolyamatot a kill -9 utasítás. A Bash parancssor azonban olyan gyorsan tér vissza, hogy még azelőtt visszatér, hogy a folyamatütemező jelentené a háttérfolyamat leállítását.

És csak akkor fogja ezt megtenni, ha az értesítés összhangban van a meglévő munkával, azaz inkább pull-alapú, mint push-alapú. Amikor eltaláljuk az enter billentyűt, a rendszer ellenőrzi és értesíti, hogy az első háttérfolyamat most véget ért, vagy inkább befejeződött / megölték; [1]+ Killed gnome-calculator.

Visszatérve a mi kill command, egy jel 9 kill az egyik legpusztítóbb öl. Alapvetően a helyszínen fejezi be a programot anélkül, hogy kedves lenne vele. Áttekintheti a “Jelforrás számozása a szabványos jelekhez” részt, amely elérhető a man signal.7 a terminál parancssorán végrehajtott parancs az összes rendelkezésre álló jel és azok megfelelő számainak felsorolásához.

E cikk alkalmazásában a következőket fogjuk használni jelzés 9 hogy mindig azonnal és hatékonyan fejezzen be egy folyamatot. Azonban még akkor is, ha a jelzés 9 ölés / folyamat befejezése, néha egy folyamat elidőzhet a elhunyt állapot.

Ez nem gyakran fordul elő általában a DevOps munkájában, és ha mégis megtörténik, az általában azt jelenti, hogy komoly problémák merültek fel a program kódjában (a futtatott folyamat), vagy a rendszer hardverében vagy az operációs rendszerben.

A hibák elkerülése és csak a saját tulajdonú folyamatok kiválasztása

Újra kezdve a fenti eljárással, van-e mód arra, hogy automatizálja a PID választás, így nem kell manuálisan beírnunk, és így egy szkripten belül is felhasználhatjuk? Biztos van;

gnome-calculator &
ps -ef | grep 'gnome-calculator' | grep -v 'grep' | awk '{print $2}'
ps -ef | grep 'gnome-calculator' | grep -v 'grep' | awk '{print $2}' | xargs kill -9

Jobban definiált folyamat leállítás Linux alatt

Itt kezdtük újra gnome-calculator háttér módban, és újra felhasználva ps és grep hogy megtaláljuk a folyamatunkat. Itt ér véget a hasonlóság. A Bash csövek soron következő utasításában (az előző parancsról a következőre csövek szimbólumával továbbítja az információkat: |) kizárjuk a grep maga a folyamat (szintén a ps kimenetet, ahogy a parancssorunk alatt fut, és így a grep), a -v opció grep és kizárva a szót 'grep'.

Végül kinyomtatjuk a PID (process ID) minden felfedezett folyamatról a awk és kinyomtatja a másodikat ($2) csak a kimenet oszlopát. Azt látjuk, hogy csak egyetlen PID visszatér, ami megfelel annak a ténynek, hogy csak egyetlen van gnome-calculator megkezdődött.

Végső parancsunk hozzáad egy xargs parancs a kill -9 utasítás folyamatunk (k) leállítására. Az xargs önmagában hasonlóan működik, mint egy cső, de jobban képes kezelni a különböző bemeneti információkat és helyesen továbbadni, lehetővé téve bizonyos programokat, mint például kill (ami natív módon nem érthető meg, amikor egyszerű PIDküldünk neki), hogy elfogadja a közvetlen bevitelt, vagy inkább opciókat – például a folyamatazonosítót itt továbbítják. Ne feledje, hogy az xargs előtagja egy cső.

Bevezetésünk a grep -v 'grep' elkerüli nemcsak az esetleges hibáját kill parancs nem találja a PID az eredetihez társítva grep parancs (mivel azóta megszűnt, miután teljesítette kötelességét, hogy a 'gnome-calculator' szöveg), másodsorban megakadályozza egy másik, újabb parancs / folyamat megszakításának kockázatát, amelyet esetleg az eredeti grep megszűnt, ugyanazzal a folyamatazonosítóval! Annak ellenére, hogy ennek előfordulása kicsi, lehetséges.

Ezeknek a dolgoknak a parancsnokságba történő átdolgozása jobban néz ki, de még nem tökéletes. Mi ez a szerver 10 felhasználóval, és mind a 10 elindított egy számológépet? Feltéve, hogy sudo-szerű privilégiumokkal rendelkezünk, valóban le akarjuk állítani a többi felhasználó számológép-folyamatait? Valószínűleg nem. Tehát léphetünk tovább és a következőképpen határozhatjuk meg a parancsunkat:

gnome-calculator &
ps -ef | grep 'gnome-calculator' | grep -v 'grep' | grep "$(whoami)" | awk '{print $2}'
ps -ef | grep 'gnome-calculator' | grep -v 'grep' | grep "$(whoami)" | awk '{print $2}' | xargs kill -9

A tulajdonos folyamatok kizárása a folyamatmegszakító parancsból

Ebben a példában egy kis kiegészítő parancsot illesztettünk be, mégpedig grep "$(whoami)", amely végrehajtott egy alhéjat ($(...)), majd végrehajtja whoami azon az alhéjon belül. Az whoami A parancs visszatér a terminálhoz az aktuálisan bejelentkezett felhasználókhoz. Bingó! Most már csak a saját tulajdonú folyamatainkat szüntetjük meg.

Tökéletes? Nem, sajnos hibák még mindig lehetségesek egy ilyen részletesen beállított parancssor mellett is. Például, ha a folyamatlista területi vagy páratlan karaktereket tartalmaz, akkor a grep még mindig kudarcot vallhat. Talán a legbiztonságosabb változat valami hasonló lenne:

gnome-calculator &
ps -ef | grep -Ei --binary-files=text "^$(whoami) [0-9 ]+:.*gnome-calculator$" | grep --binary-files=text -v 'grep' | awk '{print $2}' | grep --binary-files=text  -o '[0-9]+' | xargs -I{} kill -9 "{}"

Biztonságosabb verzió vagy több folyamatot lezáró parancs

Ebben a példában meghatároztuk grep parancs sokkal korlátozóbb egy reguláris kifejezéssel: start (jelzi ^) a felhasználónévvel (a whoami alhéjban), majd egy kötelező szóköz, amelyet csak a karakterek követnek 0-9 és tér, legalább egy vagy több (amint azt a +), amelyet egy kötelező kettőspont követ (az idő egy részében), majd bármely karaktert a programunk nevéig, amelyet a sor végéig kell kitölteni (amint azt a $). Az grep kiterjesztett reguláris kifejezéseket használ (-E), és a kis- és nagybetűk nem érzékenyek (-i vagy egyszerűen i amikor hozzáadják a meglévőhöz -E választási lehetőség)

Használatával megvédtük a grepünket is a lokális vagy páratlan karakterek páratlan lehetősége miatt --binary-files=text, és biztonságosabb módon írtuk meg az xargs-t úgy, hogy feltüntettünk egy helyettesítő karakterláncot, és idézzük a helyettesítő karakterláncot.

Végül beillesztettünk egy kiegészítőt grep -o szabályos kifejezéssel, amely a számokat keresi 0-9 csak. Így, még akkor is, ha valamelyik program megpróbálja átverni ezt a folyamatot megölő parancssort, ezt nehezebb megtenni.

Az értelmező parancssor definiálásának érdekes alternatívájaként érdemes áttekinteni a killall parancs:

gnome-calculator &
killall 'gnome-calculator'

Példa egy killall parancs kimenetelére

A parancsról további információt a kézikönyv használatával érhet el man killall. Az killall parancs lehetővé teszi olyan beállítások beállítását is, mint --user hogy csak a megadott felhasználó tulajdonában lévő folyamatokat ölje meg stb.

Csomagolás

A folyamatok különböző módon történő kezelése lehetővé teszi számunkra a folyamatőrző szkriptek írását, a folyamatkezelés automatizálását, a többszálas bash kód jobb fejlesztését, a folyamatok jobb kezelését és még sok mást. Élvezze az új megtalált Bash készségeit!


Source link


13 Views 0 Ratings Rate it

  • Minden jog fenntartva 2019-2020. Hogyankészítsek.Hu Impresszum Adatkezelési szabályok