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.
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
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
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
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 "{}"
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'
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!