ITKA203 Käyttöjärjestelmät -kurssin Demo 3 keväällä 2014. "Superpikajatkoa shellin käyttöön"
Paavo Nieminen, paavo.j.nieminen@jyu.fi
Jyväskylän yliopiston tietotekniikan laitos.
Contents
Tämä on uutta materiaalia keväällä 2014, ja muokkauksia tulee varmasti ensimmäisten rohkeiden tekijöiden antaman palautteen perusteella.
Tarkoitus on jatkaa ensimmäisen demon pohjalta interaktiivisen shellin, erityisesti bashin, tehokäyttöä muutamien elämää helpottavien niksien kautta. Tutustutaan kurssin luennoissa meneillään oleviin asioihin (prosessit, signaalit) käytännössä. Lisäksi hankitaan lisää kädentaitoja tutustumalla joihinkin näppäriin apuohjelmiin. Tehdään myös ensimmäinen, tässä vaiheessa vielä hyvin triviaali, skripti eli komentoriviohjelma.
Tämän demon voi vielä tehdä Jyväskylän yliopiston yleisillä suorakäyttökoneilla (jalava, halava). Pysyttele silloin varovaisesti ohjeen mukaisissa toiminnoissa. Kurssin puolivälin jälkeen tullaan käyttämään kurssin omaa testipalvelinta itka203.it.jyu.fi, jossa voidaan leikkiä vapaammin ja muita käyttäjiä häiritsemättä, mutta hintana on mm. se että kotihakemistoa ("U-asema") ei ole kytketty, koneella sijaitsevia tietoja ei varmuuskopioida ja palvelin saattaa lakata toimimasta kesken kaiken.
Harjoituksen tavoitteet:
- Shellin ja pääteyhteyden käyttö sujuvoituu.
- Kurssin käsitteet konkretisoituvat itse naputtelemiesi esimerkkien kautta nähtynä.
- Teet ensimmäisen skriptin.
Muista ensimmäisen demon varoitukset! Ajattele ennen kuin kirjoitat, ja ajattele uudelleen ennen kuin painat enteriä. Muutenkin voi kerrata asioita ensimmäisestä superpikaintrosta.
Jatketaan siitä, mihin aiemmin jäätiin (kertaile, jos on epäselvää): Osaat ottaa ssh-yhteyden yliopiston Linux-palvelimeen ja ymmärrät antavasi Bourne Again Shell (bash) -nimiselle shellille tekstimuotoisia komentorivejä, jotka shell suorittaa melko läheisessä yhteistoiminnassa palvelimeen asennetun käyttöjärjestelmän kanssa. Luennolla ja kurssimateriaalissa on nähty C-kielellä toteutettuna jotakuinkin yksinkertaisin mahdollinen "karu-shelli" ilman kehittyneiden shellien helppokäyttötoimintoja ja kikkakolmosia.
Useat "ikkunat" yhtäaikaa käynnissä olevien ohjelmien käyttöön ovat arkipäivää mikrotietokoneissa sekä myös tableteissa ja älypuhelimissa (pienellä näytöllä näkyy kerrallaan vain yksi ikkuna, mutta voidaan ajatella että muidenkin ohjelmien ikkunat ovat "alla" tallella, vaikkei niitä juuri nyt käytetä - sovellukset ovat käynnissä taustalla ja niiden välillä voidaan vaihtaa jonkinlaisen ikkunamanagerin avustuksella). Linux-pääteyhteyttäkin olet mitä luultavimmin käytellyt tavallisen ikkunan kautta, esimerkiksi mikroluokkaan tai kotikoneelle asennetun KiTTY-yhteysohjelman kautta. Useiden sovellusten käyttäminen yhtäaikaa on näppärää myös palvelinkoneella, esimerkiksi tekstin editoiminen yhdessä ikkunassa ja ohjelman ajaminen ja tulosten tarkastelu toisessa ikkunassa on järkevältä kuulostava toimintamalli. Pääteyhteyden rinnalle voi toki avata toisen, ihan vain käynnistämällä KiTTYstä toinen instanssi ja ottamalla toinen yhteys etäkoneeseen. Tässä demossa harjoitellaan kuitenkin toista tapaa saada aikaan eri ikkunoita tekstimuotoisen pääteyhteyden yli.
Apuohjelma nimeltä screen mahdollistaa yhdenaikaiset teksti-"ikkunat", joista yksi on kerrallaan näkyvillä. Katso huvikseen manuaalisivua komentamalla:
man screen
Siitähän se lähtee:
- "Screen is a full-screen window manager that multiplexes a physical
- terminal between several processes (typically interactive shells). Each virtual terminal provides the functions of a DEC VT100 terminal ..."
Manuaalissa mainittu DEC VT100 on Intelin prosessoriin perustuva terminaali, joka tuotiin markkinoille ennen tämän demolapun kirjoittajaa. Nykyisetkin päätteet emuloivat kyseistä vehjettä kivasti ( http://fi.wikipedia.org/wiki/VT100 ). Asiaan. (Intertekstuaalinen viite tarkoituksellinen.) Manuaali kertoo asian pidemmästi, mutta tässä on lyhyt suomenkielinen kiteytys: Screen on ohjelma, joka monistaa yhden pääteyhteyden "päällekkäisiksi ikkunoiksi", joista yhtä voi käytellä ja toisissa voi olla ohjelmia käynnissä "taustalla". Lisäksi screenin voi pyytää irrottautumaan (engl. detach) vanhempiprosessistaan, mikä tekee siitä erityisen miellyttävän apuvälineen etäkoneiden käyttöön: Käyttäjä voi kirjautua ulos etäkoneesta, mutta screen sekä kaikki sen avulla käynnistetyt ohjelmat voidaan jättää käyntiin palvelimelle. Tyypillinen käyttötarkoitus yliopiston opiskelijoiden ja henkilökunnan keskuudessa onkin silminnähden (useimpina kellonaikoina komennolla ps -ef todeten) IRC-keskusteluverkon käyttö siten, että keskustelijan asiakasohjelma on läsnä vaikka itse henkilö ei olisi kirjautuneena palvelimelle. Jotkut näyttävät käyttävän myös tekstimuotoisia email-ohjelmia, joista etäkoneillemme on asennettu ainakin pine ja mutt.
Jos sinulla ei vielä ole palvelimella käynnistettyä screeniä, ensimmäinen lähtee päälle oletusasetuksilla komentamalla:
screen
Komento ilman argumentteja käynnistää aina uuden instanssin screenistä. Tyypilliseen käyttötarpeeseen yksikin riittää. Anna joku simppeli komento, jolla on tuloste. Esimerkiksi:
ls
Screeniä ohjataan kaksimerkkisillä ohjauskomennoilla, jotka oletusarvoisesti aloitetaan painamalla Ctrl-a ja jatketaan toisella näppäimellä. Screenin irrottaminen vanhempiprosessista tapahtuu näppäilyllä Ctrl-a d eli ensin painetaan Ctrl-a ja seuraavaksi d. Kokeile.
Tilanne pitäisi olla, että edellä käynnistetty screen-prosessi on yhä taustalla, irrallaan pyörimässä. Siihen voi kytkeytyä uudelleen (reattach) komennolla:
screen -r
Tyypillistä on laittaa toiseksi argumentiksi vielä -d (detach) jolloin screen osaa irrottautua toisesta pääteyhteydestä, jos se oli sellaiseen kytketty, esimerkiksi kotikoneelta käsin:
screen -d -r
Kokeile. Pitäisi päästä takaisin edelliseen näyttöön. Jos jostain syystä on päällä useita instansseja screenistä, sinulle näytetään lista kyseisten instanssien prosessi-ID:stä, joista annetaan argumenttina se, johon halutaan kytkeytyä.
Koko screen lopettaa toimintansa silloin, kun sillä ei ole itsellään enää yhtään lapsiprosessia. Kokeile lopettaa screen kirjoittamalla screenin sisällä pyörivään shelliin:
exit
Nyt screenillä ei ollut enää mitään tehtävää, ja sen suoritus loppui. Seuraava komento ei siis löydä yhtään olemassa olevaa screen-instanssia irrotettavaksi edellisestä yhteydestä ja liitettäväksi siihen, jossa operoit:
screen -d -r
Saa kokeilla. Jatketaan kuitenkin harjoituksia tämän demon loppuun screenissä, joten käynnistä se uudelleen. Komennon osaat jo.
Manuaalissa luetellaan runsaasti screenin komentoriviargumentteja ja näppäinkomentoja. Tässä on peruskäytön kannalta tärkeimmät näppäinyhdistelmät poimittuna. Vapaat suomennokset ja toimintakuvaelma alempana. Päällekkäisistä versioista voi valita jomman kumman; joissakin toiminnoissa on vain yksi vaihtoehto. Isoilla ja pienillä kirjaimilla on screenin käyttöliittymässä eroa:
C-a a (meta) Send the command character (C-a) to window. See escape command. C-a c C-a C-c (screen) Create a new window with a shell and switch to that window. C-a d C-a C-d (detach) Detach screen from this terminal. C-a f C-a C-f (flow) Toggle flow on, off or auto. C-a n C-a C-n (next) Switch to the next window. C-a p C-a C-p (prev) Switch to the previous window (opposite of C-a n). C-a ? (help) Show key bindings. C-a [ C-a C-[ C-a esc (copy) Enter copy/scrollback mode.
Komennoista Ctrl-a d (detach) tuli käsiteltyä ja kokeiltua jo aiemmin. Seuraavassa selitetään muut komennot ohjeen kirjoittajan mielipiteen mukaisessa tärkeysjärjesteyksessä peruskäytön kannalta.
Näppäily Ctrl-a c luo uuden ikkunan aiempien päälle, ja käynnistää ikkunaan shellin. Päällimmäisenä olevaa ikkunaa voi vaihtaa luontijärjestyksessä seuraavaan (next) ja edelliseen (prev) näppäilyillä Ctrl-a n ja Ctrl-a p. Näppäilyllä Ctrl-a f vaihtuva Flow-tila (on/off/auto) vaikuttaa tiettyjen näppäinten tulkintatapaan - kurssin luennoilla käytetyssä sessiossa tila on off, ja se saattaa vaikuttaa siihen, miten erityisnäppäilyt vaikuttavat luentoesimerkeissä.
Näyppäilyllä Ctrl-a esc pääsee selaamaan screenin tulostehistoriaa (lisäselvitys alempana). Näppäily Ctrl-a a syöttää päällimmäisessä ikkunassa olevalle prosessille todellisen Ctrl-a -painalluksen, jota sille ei muilla keinoin pysty screenin kautta syöttämään, koska screen nappaa sen omaan tarkoitukseensa. Näppäily Ctrl-a ? näyttää listan screenin osaamista näppäinyhdistelmistä, joita tässä selviytymisohjeessa ei ole tarvetta mainita. Jälleen kerran, manuaali kertoo enemmän ja Internet vielä enemmän.
Screenin käytössä on seuraavanlaisia implikaatioita:
Kokeile screenin käyttöä hieman, eli ikkunoiden luontia, ikkunoiden sulkeutumista exitillä ja ikkunoiden välillä vaihtamista. Ideana on, että tämän demon palautustehtävä kirjoitetaan yhdessä screen-ikkunassa etäkoneeseen asennetulla tekstieditorilla ja sitä kokeillaan toisessa screen-ikkunassa.
Nyt olet saanut haltuun varsin näppärän työkalun etäyhteyksien käyttössä. Otetaan vielä pari elämää helpottavaa kikkaa ensimmäisessä demossa nähtyjen lisäksi (ihan vaan motivoivina esimerkkeinä; asiasta kiinnostuneet löytänevät lisää omatoimisesti Internetin tutoriaaleista).
[TODO: Rivin editointi ja komentohistoria ilman nuolinäppäimiä. Reverse search -ominaisuus. Muita kikkoja?]
[TODO: ps, top, näkymät ja perusargumentit]
Linuxin tiedostojärjestelmästä toteutuksineen puhutaan kurssilla myöhemmin lisää. Katsotaan käyttäjän näkökulmaa tässä vaiheessa etäkoneen shellissä.
Komenna:
ls -l
Optiolla -l tiedostoja listaava ohjelma ls näyttää tiedostoista niiden nimen lisäksi lisätietoja, kuten käyttäjän ja käyttäjäryhmän, joille tiedosto kuuluu, sekä tiedoston käyttöoikeudet. Käyttöoikeudet näytetään vasemmalla puolella tulostetta, esimerkiksi seuraavasti:
-rwx--x--x. 1 nieminen nobody 9549 8.4. 13:54 a.out
Itse asiassa siitä näkyy tiedoston moodi muutenkin. Tulosteessa on 10 merkkiä, jotka ovat joko - tai tietty kirjain. Viimeiset yhdeksän kertovat käyttöoikeuksista jakautuen kolmeen kolmimerkkiseen pätkään, joissa toistuvat järjestyksessä merkit r```niinkuin 'read', ``w niinkuin 'write' ja x niinkuin 'execute'. Merkit vastaavat luku-, kirjoitus- ja suoritusoikeutta; jos merkin paikalla on viiva - niin kyseinen oikeus puuttuu. Kolmen merkin pätkät taas vastaavat järjestyksessä käyttäjälle itselleen (esimerkissä käyttäjätunnus nieminen), ryhmälle (esimerkissä ryhmätunnus nobody) sekä aivan kaikille järjestelmän käyttäjille annettuja oikeuksia. Esimerkissä siis nieminen saa lukea, kirjoittaa ja suorittaa tiedostoa a.out; ryhmän nobody jäsenet saavat vain suorittaa; samoin muut kuin nieminen tai nobody-ryhmäläiset saavat suorittaa mutteivät muuta.
Oikeuksia voi muuttaa ohjelmalla chmod. Manuaali kertoo enemmän; tässä joitakin esimerkkejä:
chmod u+x TIEDOSTONIMI
Tiedoston omistajaksi merkitylle käyttäjälle (u niinkuin 'user') annetaan (+ niinkuin 'lisäys') oikeus suorittaa (x niinkuin 'execute') tiedosto, jonka nimi komennossa annetaan. Sen sijaan seuraava komento toimii päinvastoin:
chmod u-x TIEDOSTONIMI
Tässä jälkimmäisessä tiedoston omistajaksi merkityltä käyttäjältä (u niinkuin 'user') poistetaan (- niinkuin vähemmän) oikeus suorittaa (x niinkuin execute) tiedosto, jonka nimi komennossa annetaan.
Totuttele komentoon: kokeile tehdä vaikka joku humpuukitiedosto, anna ja poista sille oikeuksia ja katso kuinka ls -l -komennon tuloste muuttuu. Turvallisuuden vuoksi älä kajoa laajemmin tiedostojesi tai varsinkaan hakemistojesi käyttöoikeuksiin ennen kuin olet oppinut aiheen yksityiskohdat.
Normaaliolosuhteissa käytämme ohjelmakoodin ja järjestelmäylläpidon tehtäviin työpaikan tarjoamia tai itse hankittuja graafisia työkaluja, joihin mm. IDEt ja tekstieditorit lukeutuvat. Materiaalit kehitetään lokaalisti, ylläpidetään jaetussa versionhallinnassa ja siirretään tuotantoversiot tarvittaessa palvelimille.
Joskus tarvitsee hätätilanteessa (tai siksi että se on vaan nopeampaa kuin kopioida tiedostoja edestakaisin) tehdä jotakin ylläpitotoimenpiteitä suoraan pääteyhteydellä tekstieditorilla, jossa ei ole graafista käyttöliittymää. Näitä tilanteita varten tällä kurssilla totutellaan tekstieditointiin päätteellä.
Tässä osiossa esitellään ensiksi nano, joka riittää kurssin tarpeisiin ja on helppokäyttöinen. Jos aikasi on rajallinen, riittää siis tutustua nanoon, jolla (ei kovin tehokkaasti kylläkään) pystyy tekemään tämän sekä myöhemmät tämän kurssin demot.
Vapaaehtoisena osiona kerrotaan myös editorista emacs, joka tukee varsin monimuotoista tehotyöskentelyä tekstin ja lähdekoodin editointiin. Näitä editoriskaalan ääripäitä (nano, emacs) ei ole aina mukana palvelinten perusasennuksissa, joten toisena vapaaehtoisena pätkänä kerrotaan editorista vim, joka on myös hyvin tehokas työkalu ja joka aika usein löytyy pääteyhteyttä tukevalta palvelimelta perusasennuksesta ilman erillisiä asennuspyyntöjä. Lopussa vielä kerrotaan automaattisesta tekstieditoinnista, joka voi joskus tarjota nopeimman ja helpoimman keinon etsi- ja korvaa -tyyliisiin tai muihin mekaanisiin tekstinkäsittelytehtäviin. Tyypillisiä työkaluja viimeksi mainittuun ovat ainakin sed ja awk, joiden käyttöön saatetaan palata vapaaehtoisessa demossa myöhemmin.
[TODO: Kirjoita vähän lisää ohjetta nanolle?]
Tämä lyhyt osuus tarjoaa katsauksen yhteen helppoon tekstieditoriohjelmaan, joka ainakin Linuxeista usein löytyy.
Komenna:
nano
Käynnistit juuri tekstieditorin nimeltä GNU nano. Sitä on aika helppo käyttää, mutta se ei ole kovin monipuolinen. Nano on aika itsensäselittävä ohjelma. Sen voi lopettaa kokonaan näppäilemällä Ctrl-X. Tämä kuten muut näppäinkomennot näkyvät jatkuvasti Nano-ikkunan alalaidassa muodossa ^X.
TODO: Taustatietoa ja ohjeita emacsille
TODO: Taustatietoa ja ohjeita vimille. Tarviin apuja tähän; en ole vimiläinen.
TODO: Taustatietoa ja ohjeita sedille ja awkille. Tarviin apuja myös tähän.
Varioidaan ensimmäisessä demossa tehtyä palautustehtävää. Tällä kertaa kuitenkin automatisoidaan tämä toimenpide, eli tehdään noin kuutisen riviä pitkä skripti, joka tuottaa halutunlaisen tulosteen. Muoto olisi seuraavanlainen (huomaa pienet erot aiempaan):
Mikä ja miksi on skripti? Skripti (engl. script) eli "komentojono" tai "komentoriviohjelma" on shellin, esimerkiksi bashin, ymmärtämän syntaksin mukainen ohjelma, jonka shell lukee, tulkkaa ja suorittaa rivi riviltä. Laajemmin ajateltuna skriptiksi voitaisiin sanoa millä tahansa tulkattavalla kielellä tehtyä ohjelmaa, mutta käyttöjärjestelmien mielessä kiinnostavaa on tietysti juuri käyttöjärjestelmäkuorella eli shellillä ajettavat skriptit esimerkiksi käyttöjärjestelmän ylläpitotehtävien (käynnistys, alasajo, logit, päivitykset, varmuuskopioinnit, ...) hoitamiseen.
Yksinkertaisimmillaan skripti koostuu peräkkäisistä komennoista, joita voisi yhtä hyvin kirjoittaa ja suorituttaa interaktiivisesti peräkkäin. Skriptiin kirjoitettuna ne jäävät kuitenkin talteen mahdollista myöhempää uudelleenkäyttöä varten. Useamman suoritettavan komentorivin kirjoittaminen on joka tapauksessa helpompaa ja vähemmän virhealtista tekstieditorilla kuin suoraan interaktiivisesti. Shell-skriptit voivat myös ottaa normaalien ohjelmien tapaan argumentteja, ja niihin voidaan kirjoittaa normaaleja ohjelmointirakenteita kuten muuttujia, aliohjelmia, silmukoita ja ehtoja. Shell-skriptit ovat todellinen järjestelmäylläpitäjän tehotyökalu.
Aloitetaan harjoitteet yksinkertaisesta päästä: Käytä valitsemaasi tekstieditoria ja kirjoita peräkkäisille riveille ylläolevassa tehtäväkuvauksessa tarvittavat komennot. Ensimmäisellä rivillä skriptissä tulee ilmoittaa risuaidan ja huutomerkin jälkeen shell-ohjelman eli meidän esimerkeissämme bashin sijainti ja muutama bashille spesifi argumentti varotoimenpiteenä. Eli skriptisi tulee alkamaan jotakuinkin näin:
#!/bin/bash -eu whoami > kj14_demo3_tuloste.txt ...
Huomaa, että tiedoston aiempi sisältö häviää, kun ohjataan tuloste väkäsellä; välilyönnit tulkitaan erotinmerkeiksi jne., joten ole edelleen perusvarovainen ja koeta etukäteen hahmottaa mitä suorituksissa tapahtuu. Tulevassa vapaaehtoisessa demossa opetellaan tekemään toimintavarmempia ja turvallisempia skriptejä, joille voi antaa kohdetiedoston nimen argumenttina ja jotka kieltäytyvät tekemästä tuhoisaa toimenpidettä, jos kohdetiedosto on jo olemassa. Mutta ei sekoiteta päätä vielä sillä, vaan kovakoodataan tuo tulostetiedoston nimi vaikkapa juuri kj14_demo3_tuloste.txt.
Skripti pitää voida ajaa oleskeluhakemistosta, eli komentamalla:
./demo3_skripti.sh
Tätä varten tiedoston käyttöoikeuksiin pitää lisätä suoritusoikeus käyttäjälle itselleen. Käytä siis komentoa chmod sopivasti. Älä lisää muita kuin välttämättömät oikeudet! Tässä vaiheessa tarvitset vain suoritusoikeuden käyttäjälle.
Tästä demosta täytyy olla palautettuna Optima-järjestelmän palautuskansioon tasan kaksi tiedostoa nimiltään "demo3_skripti.sh" ja "kj14_demo3_tuloste.txt", jotka teit edellisessä osiossa. Vastauksen muodosta voidaan jälleen todeta, että olet ollut omilla tunnuksilla suorakäyttökoneessa, käyttänyt screeniä, asettanut skriptille käyttöoikeudet ja saanut sen ajettua niin että tulokseen tulee oikeanlaiset rivit. Jos et ollut aiemmin ohjelmoinut skriptiä unix-shellillä, niin nytpä olet!
Tämä oli vasta ensikosketus. Myöhemmässä vapaaehtoisessa "bonukset päälle" -demossa käydään läpi aivan oikeata shell-ohjelmointia, jossa opitaan tekemään normaaleja ohjelmointirakenteita, kuten silmukoita ja ehtoja. Käydään läpi myös joitakin perusmallin apuohjelmia, joiden käyttöön skriptien voima osittain perustuu.