Edellinen | Sisällysluettelo | Sisällysluettelo | Seuraava
Edellisellä oppitunnilla tarkastelimme Linuxin monikäyttäjäkäyttöjärjestelmän vaikutuksia. Tällä oppitunnilla tarkastelemme Linuxin moniajo-ominaisuutta ja sitä, miten sitä hallitaan komentorivikäyttöliittymällä.
Kuten mikä tahansa moniajo-käyttöjärjestelmä, Linux suorittaa useita samanaikaisia prosesseja. No, ainakin ne näyttävät samanaikaisilta. Todellisuudessa yksi prosessoriydin voi suorittaa vain yhtä prosessia kerrallaan, mutta Linux-ydin onnistuu antamaan jokaiselle prosessille oman vuoronsa prosessorin ääressä ja jokainen näyttää olevan käynnissä samaan aikaan.
Prosesseja ohjataan useilla komennoilla. Ne ovat:
-
ps
– listaa järjestelmässä käynnissä olevat prosessit -
kill
– lähettää signaalin yhdelle tai useammalle prosessille (yleensä prosessin ”tappamiseksi”) -
jobs
– vaihtoehtoinen tapa listata omia prosesseja -
bg
. prosessin laittaminen taustalle -
fg
– prosessin laittaminen etualalle
Käytännön esimerkki
Vaikkakin saattaa vaikuttaa siltä, että tämä aihe on melko hämärä, se voi olla hyvin käytännöllinen keskivertokäyttäjälle, joka työskentelee enimmäkseen graafisen käyttöliittymän kanssa. Vaikka se ei ehkä olekaan ilmeistä, useimmat (ellei kaikki) graafiset ohjelmat voidaan käynnistää komentoriviltä. Tässä on esimerkki: X-ikkunajärjestelmän mukana toimitetaan pieni ohjelma nimeltä xload, joka näyttää järjestelmän kuormitusta kuvaavan kuvaajan. Voimme suorittaa tämän ohjelman kirjoittamalla seuraavaa:
xload
Huomaa, että pieni xload
-ikkuna ilmestyy ja alkaa näyttää järjestelmän kuormituksen kuvaajaa. Järjestelmissä, joissa xload
ei ole käytettävissä, kokeile sen sijaan gedit
. Huomaa myös, että kehotteemme ei ilmestynyt uudelleen ohjelman käynnistymisen jälkeen. Komentotulkki odottaa ohjelman päättymistä ennen kuin ohjaus palaa. Jos suljemme xload
-ikkunan, xload-ohjelma päättyy ja komentokehote palaa.
Ohjelman asettaminen taustalle
Tehdäksemme elämästä hieman helpompaa, käynnistämme xload-ohjelman uudestaan, mutta tällä kertaa asetamme sen taustalle, jotta komentokehote palaa. Tätä varten suoritamme xloadin näin:
xload &
1223$Tässä tapauksessa kehote palasi, koska prosessi laitettiin taustalle.
Asettele nyt, että unohdimme käyttää ”&”-symbolia ohjelman laittamiseksi taustalle. Vielä on toivoa. Voimme kirjoittaa Ctrl-z
ja prosessi keskeytetään. Voimme todentaa tämän havaitsemalla, että ohjelman ikkuna on jäätynyt. Prosessi on edelleen olemassa, mutta se on käyttämättömänä. Jos haluat jatkaa prosessia taustalla, kirjoita komento bg
(lyhenne sanoistabackground). Tässä on esimerkki:
xload
+ Stopped xload$ bg
+ xload &Luettelo käynnissä olevista prosesseista
Nyt kun meillä on prosessi taustalla, olisi hyödyllistä näyttääluettelo käynnistetyistä prosesseista. Tähän voimme käyttää jokojobs
-komentoa tai tehokkaampaa ps-komentoa.
jobs
+ Käynnissä oleva 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$Prosessin tappaminen
Asettakaamme, että meillä on ohjelma, joka muuttuu reagoimattomaksi; miten pääsemme siitä eroon? Käytämme tietysti komentoa kill
. Kokeillaan tätä xload
:llä. Ensin on tunnistettava prosessi, jonka haluamme tappaa. Voimme käyttää tähän joko jobs
tai ps
. Jos käytämme jobs, saamme takaisin työn numeron. Käyttämällä ps
saamme prosessin tunnuksen (PID). Teemme sen bothways:
xload &
1292$ jobs
+ Running xload&$ kill %1
$ xload &
1293 Terminated 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$Hieman lisää kill
Käskyä kill
käytetään prosessien ”tappamiseen”, mutta sen todellinen tarkoitus on lähettää signaaleja prosesseille. Useimmiten signaalin tarkoituksena on käskeä prosessia poistumaan, mutta siihen liittyy muutakin. Ohjelmat (jos ne on kirjoitettu oikein) kuuntelevat käyttöjärjestelmän signaaleja ja vastaavat niihin, useimmiten salliakseen jonkin häikäilemättömän lopettamistavan. Esimerkiksi tekstieditori voi kuunnella mitä tahansa signaalia, joka osoittaa, että käyttäjä on kirjautumassa ulos tai että tietokone on sammumassa. Kun se vastaanottaa tämän signaalin, se voi tallentaa käynnissä olevan työn ennen poistumista. Komennolla kill
voidaan lähettää erilaisia signaaleja prosesseille. Kirjoittamalla:
kill -l
tulostaa luettelon sen tukemista signaaleista. Monet ovat melko epämääräisiä,mutta useat ovat käteviä tietää:
Signaali # | Nimi | Kuvaus |
1 | SIGHUP | Luovutussignaali. Ohjelmat voivat kuunnella tätä signaalia ja toimia sen mukaan. Tämä signaali lähetetään terminaalissa käynnissä oleville prosesseille, kun suljet terminaalin. |
2 | SIGINT | Keskeytyssignaali. Tämä signaali annetaan prosesseille niiden keskeyttämiseksi. Ohjelmat voivat käsitellä tätä signaalia ja toimia sen mukaan. Voimme antaa tämän signaalin myös suoraan kirjoittamalla Ctrl-c terminaali-ikkunassa, jossa ohjelma on käynnissä. |
15 | SIGTERM | Lopetussignaali. Tämä signaali annetaan prosesseille niiden lopettamiseksi. Ohjelmat voivat taas käsitellä tätä signaalia ja toimia sen mukaan. Tämä on oletussignaali, jonka kill -komento lähettää, jos mitään signaalia ei ole määritetty. |
9 | SIGKILL | Tapposignaali. Tämä signaali aiheuttaa prosessin välittömän lopettamisen Linux-ytimen toimesta. Ohjelmat eivät voi kuunnella tätä signaalia. |
Asettakaamme nyt, että meillä on ohjelma, joka on toivottomasti jumissa ja haluamme päästä siitä eroon. Teemme näin:
- Käytä komentoa
ps
saadaksesi sen prosessin prosessitunnuksen (PID), jonka haluamme lopettaa. - Anna komento
kill
kyseiselle PID:lle. - Jos prosessi kieltäytyy lopettamasta (ts, se jättää signaalin huomiotta), lähetä yhä kovempia signaaleja, kunnes se lopettaa.
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
Edellisessä esimerkissä käytimme komentoa ps
x-optiolla luetellaksemme kaikki prosessejamme (myös sellaiset, joita ei ole käynnistetty nykyisestä päätepäätteestä). Lisäksi ohjasimme ps-komennon tulosteen grep
:een listataksemme vain sen ohjelman, josta olemme kiinnostuneita. Seuraavaksi käytimme kill-ohjelmaa antamaan SIGTERM-signaalin ongelmalliselle ohjelmalle.Todellisessa käytännössä on tavallisempaa tehdä se seuraavalla tavalla, koska kill
:n lähettämä oletussignaali on SIGTERM ja kill voi käyttää signaalin nimen sijasta myös signaalin numeroa:
kill 2931
Jos prosessi ei lopeta, pakota se SIGKILL-signaalilla:
kill -9 2931
Se on siinä!
Tämä päättää oppituntisarjan ”Learning the Shell”. Seuraavassa sarjassa, ”Shell-skriptien kirjoittaminen”, tarkastelemme, miten tehtäviä voidaan automatisoida theshellin avulla.
Lisälukemista
- Aiheen syvällisemmän käsittelyn löydät Linuxin komentorivin luvusta 10.
- 1963 Timesharing: A Solution to Computer Bottlenecks, kiehtova YouTube-video Computer History Museumilta, jossa kuvataan ensimmäinen timesharing-käyttöjärjestelmä ja sen toiminta. Se on periaatteessa sama menetelmä, jota kaikki nykyajan tietokoneet käyttävät.