Előző | Tartalom | Következő
Az előző leckében a Linux többfelhasználós operációs rendszerének néhány következményét tekintettük át. Ebben a leckében a Linux többfeladatos jellegét vizsgáljuk meg, és azt, hogy hogyan vezérelhető a parancssori felülettel.
Mint minden többfeladatos operációs rendszer, a Linux is több, egyidejűleg futó folyamatot hajt végre. Legalábbis egyidejűnek tűnnek. Valójában egyetlen processzormag egyszerre csak egy folyamatot tud futtatni, de a Linuxkernel eléri, hogy minden folyamat sorra kerüljön a processzoron, és úgy tűnik, hogy mindegyik egyszerre fut.
A folyamatok vezérlésére számos parancsot használunk. Ezek a következők:
-
ps
– a rendszerben futó folyamatok listázása -
kill
– jelzés küldése egy vagy több folyamatnak (általában egy folyamat “megölése” céljából) -
jobs
– a saját folyamatok listázásának alternatív módja -
bg
– a saját folyamatok listázásának alternatív módja -
bg
. egy folyamat háttérbe helyezése -
fg
– egy folyamat előtérbe helyezése
Egy gyakorlati példa
Míg úgy tűnhet, hogy ez a téma meglehetősen homályos, nagyon is gyakorlatias lehet az átlagos felhasználó számára, aki többnyire grafikus felhasználói felülettel dolgozik. Bár talán nem nyilvánvaló, a legtöbb (ha nem is minden) grafikus program elindítható a parancssorból. Íme egy példa: van egy kis program az X Window rendszerrel együtt, az xload, amely a rendszerterhelést ábrázoló grafikont jeleníti meg. Ezt a programot a következők beírásával futtathatjuk:
xload
Figyeljük meg, hogy megjelenik a kis xload
ablak, és elkezdi megjeleníteni a rendszerterhelés grafikonját. Azokon a rendszereken, ahol a xload
nem érhető el, próbálja meg a gedit
et helyette. Vegyük észre azt is, hogy a promptunk nem jelent meg újra a program indítása után. A shell megvárja a program befejezését, mielőtt visszaadja a vezérlést. Ha bezárjuk a xload
ablakot, az xload program befejeződik, és a prompt visszatér.
Program háttérbe helyezése
Az élet megkönnyítése érdekében most újra elindítjuk az xload programot, de ezúttal a háttérbe helyezzük, hogy a prompt visszatérjen. Ehhez az xload-ot így hajtjuk végre:
xload &
1223$Ez esetben a prompt azért tért vissza, mert a folyamatot háttérbe helyeztük.
Most képzeljük el, hogy elfelejtettük a “&” szimbólumot használni a program háttérbe helyezéséhez. Még mindig van remény. Beírhatjuk a Ctrl-z
billentyűt, és a folyamat felfüggesztésre kerül. Ezt úgy tudjuk ellenőrizni, hogy látjuk, hogy a program ablaka befagyott. A folyamat még mindig létezik, de üresjáratban van. A folyamat háttérben történő folytatásához írjuk be a bg
parancsot (a background rövidítése). Íme egy példa:
xload
+ Stopped xload$ bg
+ xload &Listing Running Processes
Most, hogy van egy folyamat a háttérben, hasznos lenne egy listát megjeleníteni az elindított folyamatokról. Ehhez használhatjuk ajobs
parancsot vagy az erősebb ps parancsot.
jobs
+ Futó xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00:00 ps$Folyamat megölése
Tegyük fel, hogy van egy programunk, amely nem reagál; hogyan szabadulhatunk meg tőle? Természetesen a kill
parancsot használjuk. Próbáljuk ki ezt a xload
paranccsal. Először is azonosítanunk kell a folyamatot, amelyet meg akarunk ölni. Ehhez használhatjuk a jobs
vagy a ps
parancsot. Ha a jobs-t használjuk, akkor egy munkaszámot kapunk vissza. A ps
használatával egy folyamat azonosítót (PID) kapunk. Ezt fogjuk csinálni bothways:
xload &
1292$ jobs
+ Futó xload&$ kill %1
$ xload &
1293 Befejezett xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293
+ Terminated xload$Kicsit többet a kill
Míg a kill
parancsot a folyamatok “megölésére” használják, a valódi célja az, hogy jeleket küldjön a folyamatoknak. A legtöbbször a jelzés célja, hogy a folyamatnak azt mondja, hogy menjen el, de ennél többről van szó. A programok (ha megfelelően vannak megírva) figyelik az operációs rendszer jeleit, és válaszolnak rájuk, leggyakrabban azért, hogy lehetővé tegyék a befejezés valamilyen kíméletes módszerét. Egy szövegszerkesztő például figyelhet minden olyan jelre, amely azt jelzi, hogy a felhasználó kijelentkezik, vagy hogy a számítógép leáll. Amikor megkapja ezt a jelet, elmentheti a folyamatban lévő munkát, mielőtt kilép. A kill
parancs számos jelzést küldhet a folyamatoknak. A:
kill -l
beírása kinyomtatja az általa támogatott jelek listáját. Sok közülük meglehetősen homályos,de többről hasznos tudni:
Signal # | Name | Description |
1 | SIGHUP | Hang up signal. A programok figyelhetnek erre a jelre és reagálhatnak rá. Ezt a jelet a terminálban futó folyamatok kapják, amikor bezárjuk a terminált. |
2 | SIGINT | Megszakítási jel. Ezt a jelet a folyamatoknak adjuk, hogy megszakítsuk őket. A programok feldolgozhatják ezt a jelet, és annak hatására cselekedhetnek. Ezt a jelet közvetlenül is kiadhatjuk, ha a Ctrl-c jelet írjuk be a terminálablakba, ahol a program fut. |
15 | SIGTERM | Befejező jel. Ezt a jelet a folyamatok számára adjuk, hogy befejezzük őket. A programok ismét feldolgozhatják ezt a jelet, és ennek megfelelően cselekedhetnek. Ez az alapértelmezett jel, amelyet a kill parancs küld, ha nincs jel megadva. |
9 | SIGKILL | Megölő jel. Ez a jel a folyamat azonnali befejezését okozza a Linux kernel által. A programok nem tudnak figyelni erre a jelre. |
Tegyük fel, hogy van egy programunk, amely reménytelenül akadozik, és meg akarunk tőle szabadulni. A következőket tesszük:
- A
ps
paranccsal megkapjuk a folyamat azonosítóját (PID) annak a folyamatnak, amelyet meg akarunk szüntetni. - Kiadunk egy
kill
parancsot erre a PID-re. - Ha a folyamat nem hajlandó befejeződni (azaz, figyelmen kívül hagyja a jelzést), küldjünk egyre durvább jeleket, amíg meg nem szüntetjük.
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
A fenti példában a ps
parancsot használtuk az x opcióval az összes folyamatunk (még a nem az aktuális terminálról indítottak is) listázására. Ezen kívül a ps parancs kimenetét a grep
-ba vezettük, hogy csak a minket érdeklő programokat listázzuk ki. Ezután a kill segítségével SIGTERM jelet adtunk ki a problémás programnak.A tényleges gyakorlatban gyakoribb, hogy ezt a következő módon tesszük, mivel a kill
által küldött alapértelmezett jel a SIGTERM, és a kill a jelnév helyett a jelszámot is használhatja:
kill 2931
Ezután, ha a folyamat nem fejeződik be, kényszerítsük ki a SIGKILL jellel:
kill -9 2931
Ez az!
Ezzel zárul a “Shell megtanulása” leckesorozat. A következő sorozatban, “Shell szkriptek írása” címmel azt fogjuk megvizsgálni, hogyan automatizálhatunk feladatokat a shell segítségével.
További olvasmányok
- A téma mélyebb feldolgozásáért lásd A Linux parancssor 10. fejezetét.
- 1963 Timesharing: A Solution to Computer Bottlenecks, egy lenyűgöző YouTube-videó a Computer History Museumtól, amely leírja az első timesharing operációs rendszert és annak működését. Ez alapvetően ugyanaz a módszer, amit minden modern számítógép használ.