Munkavezérlés

Kezdőlap |

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 geditet 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&$ psPID 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$ psPID 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:

  1. A ps paranccsal megkapjuk a folyamat azonosítóját (PID) annak a folyamatnak, amelyet meg akarunk szüntetni.
  2. Kiadunk egy kill parancsot erre a PID-re.
  3. 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_programPID 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.
Top | Previous | Contents | Next

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.