Työnohjaus

Etusivu |

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

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:

  1. Käytä komentoa ps saadaksesi sen prosessin prosessitunnuksen (PID), jonka haluamme lopettaa.
  2. Anna komento kill kyseiselle PID:lle.
  3. Jos prosessi kieltäytyy lopettamasta (ts, se jättää signaalin huomiotta), lähetä yhä kovempia signaaleja, kunnes se lopettaa.
$ ps x | grep bad_programPID 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.
Alkuun | Edellinen | Sisällysluettelo | Seuraava

Vastaa

Sähköpostiosoitettasi ei julkaista.