ITKA203 Käyttöjärjestelmät -kurssin Demo 2 keväällä 2015 ja 2016 ja 2017 ja 2018 ja 2019 ja 2020 ja 2021 ja 2022 ja 2023 ja 2024. "Superpikajatko interaktiivisen Unix-kuoren käyttöön"
Paavo Nieminen, paavo.j.nieminen@jyu.fi
Jyväskylän yliopiston Informaatioteknologian tiedekunta.
STATUS: Tehtävä on päivitetty kevyesti vuodelle 2024. Raportoikaa ongelmista heti, jos ilmenee. Palautustapa sama kuin Demo 1:ssä.
Sisällys
Tämä materiaali syntyi keväällä 2014, ja tätä on pienin muutoksin käytetty sen jälkeen. Pieniä muokkauksia saatetaan tehdä kurssin aikana, jos ensimmäisten tekijöiden osalta ilmenee jotain yllättäviä ongelmia. Demo on hieman lyhempi kuin ensimmäinen, mutta se rakentuu vahvasti edellisen päälle. Kertaile tarvittaessa ja tee itselle lisämuistiinpanoja, jos tuntuu että tarvitset!
Tarkoitus on jatkaa ensimmäisen demon pohjalta interaktiivisen kuoren, erityisesti bashin, tehokäyttöä muutamien elämää helpottavien niksien kautta. Tutustutaan kurssin luennoissa meneillään oleviin tai pian esille tuleviin asioihin käytännössä. Lisäksi hankitaan lisää kädentaitoja tutustumalla joihinkin näppäriin apuohjelmiin. Tutkitaan binääritiedostoja omin käsin heksavedoksina. Tehdään lopuksi myös yksi varsin triviaali skripti eli komentoriviohjelma.
Tämän demon voi tehdä Jyväskylän yliopiston yleisillä suorakäyttökoneilla (jalava, halava). Pysyttele varovaisesti ohjeen mukaisissa toiminnoissa ja kerrytä tärkeää taitoa ymmärtää etukäteen, mitä komennot tekevät.
Harjoituksen tavoitteet:
- Kuoren ja pääteyhteyden käyttö sujuvoituu.
- Kurssin teoriaosuuden käsitteet konkretisoituvat itse naputtelemiesi esimerkkien kautta nähtynä.
- Teet ensimmäisen skriptin.
- Luennoilla ja luentomonisteessa esiteltävät komentoriviesimerkit sekä miljoonat netistä löytyvät vinkit tulevat mielekkäiksi, kun alat hahmottaa, mitä komentoja ja tulosteita niissä näkyy.
Muista ensimmäisen demon varoitukset! Ajattele ennen kuin kirjoitat, ja ajattele uudelleen ennen kuin painat enteriä. Muutenkin kannattaa kerrata asioita ensimmäisestä superpikaintrosta niin kauan kunnes asiat tulevat selkäytimestä.
Keväällä 2015 määriteltyjen osaamistavoitteiden osalta demon tehtyään opiskelija:
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 kuorelle tekstimuotoisia komentorivejä, jotka kuori suorittaa melko läheisessä yhteistoiminnassa palvelimeen asennetun käyttöjärjestelmän kanssa. Valtaosa tästä tekstimuotoisesta rajapinnasta on määritelty POSIX-standardissa, mutta GNU/Linux -ympäristössä on käyttömukavuutta ja -tehokkuutta helpottavia laajennoksia, joita hyödynnämme myös.
Tämä osio oli viimeistä kertaa mukana 2023: Tässä kokeiltiin sellaista tekstieditoria kuin Nano. Sen kanssa voi tehdä omalla ajallaan, mitä haluaa, mutta tällä opintojaksolla harjoitellaan joko Vim tai Emacs tai molemmat, ja käytetään sen jälkeen jompaa kumpaa niistä. Se on vain fiksua. Pitkään siihen oli "lähes velvoittava suositus", mutta opiskelijat tekivät itselleen liikaa hallaa jättämällä suosituksen noudattamatta.
Tarvitaan kuitenkin hieman korvaavaa materiaalia, jota pyritään nyt tuottamaan keväällä 2024 - seuraa ilmoittelua ja aihepiirivideoiden julkaisuja:
Raflaavasta otsikosta huolimatta tässäkin osuudessa on tärkeätä asiaa ja kokeiltavaa: Luodaan katsaus yhteen helppoon tekstieditoriohjelmaan, joka ainakin Linuxeista usein löytyy.
Tässä kokeiltavaa, jota voisi aihepiirivideolla näyttää prosesseista:
Käynnistä vaikka ennalta tuttu less jonkun tekstitiedoston tutkimiseksi, tai man jokukomento.
Näppäile Ctrl-z
Mitä tapahtui? Olet taas kuoressa. Komenna:
ps
Näet, että äsken käynnistetty ohjelma on yhä päällä. Mitäs, mitäs, ...?
Komenna:
jobs
Näet, että kuori-istunnossa on pysäytettyjä ohjelmasuorituksia eli prosesseja (engl. process). Kuoren kannalta ne ovat meneillään olevia töitä (engl. jobs).
Kurssimonisteessa käytetty yleistermi tällaiselle pysäytystilalle on "suspended". POSIX-standardin määrittelemä sana on "Stopped", ja standardi sallii käyttää synonyyminä "Suspended". Suomenkielisillä kieliasetuksilla kuoren ilmoittama termi on näköjään "Pysäytetty". Jonkin ohjelman suomiversion käyttämä sana hetkelliselle pysäyttämiselle saattaa olla "hyllytys"; (nämä termit ja käännökset on tarkistettu uusimmista versioista viimeksi 5.4.2024).
Voit antaa komentoja kuoressa ja käyttää muita ohjelmia. Kokeile vaikka vanha tuttu ls, joka listaa tiedostot. Pysäyttämäsi ohjelma tai useampi pysyy taustalla siinä tilassa, jossa sen pysäytit. Tämä on osa sitä käyttäjän näkökulmaa prosessinhallintaan, jonka teoriaa käyttöjärjestelmäkurssin luennoilla käydään läpi.
Komenna:
fg
Nyt viimeisin pysäytetty ohjelma tuli taas "etualalle" eli "foreground". Lisää tietoa näistä ja muusta löytyy tietenkin manuaalista, POSIXista ja muualta Internetistä.
Jatkossa halutaan editoida ohjelmakoodia tekstieditorilla ja aika samanaikaisesti kokeilla, miten ohjelmakoodi toimii käytännössä. Editori ei siis voi olla koko ajan päällä samassa ikkunassa. Vaikka sen voi edellä kerrotuilla näppäilyillä laittaa väliaikaisesti odottelemaan, on olemassa paljon näppärämpi tapa, joka on syytä ottaa haltuun tosi pian eli just nyt!
Useat "ikkunat" yhtäaikaa käynnissä olevien ohjelmien käyttöön ovat arkipäivää mikrotietokoneissa sekä myös tableteissa ja älypuhelimissa. Viimeksi mainittujen laitteiden 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 päällimmäisenä käytössä olevaa ohjelmaa voidaan vaihtaa jonkinlaisen ikkunamanagerin avustuksella.
Linux-pääteyhteyttäkin käytät mitä luultavimmin tavallisen ikkunan kautta, esimerkiksi mikroluokkaan tai kotikoneelle asennetun KiTTY-yhteysohjelman, Windowsin Powershellin tai Linuxin/Macin "Pääte" tai "Terminal" -ikkunan kautta.
Useiden sovellusten käyttäminen yhtäaikaa olisi näppärää myös palvelinkoneella: esimerkiksi tekstin editoiminen yhdessä ikkunassa ja ohjelman ajaminen ja tulosten tarkastelu toisessa ikkunassa olisi järkevältä kuulostava toimintamalli.
Pääteyhteyden rinnalle voisi periaatteessa avata toisen, ihan vain käynnistämällä KiTTYstä tai Powershellistä toinen instanssi ja ottamalla toinen rinnakkainen yhteys etäkoneeseen. Tässä demossa harjoitellaan kuitenkin erilaista tapaa saada aikaan eri ikkunoita tekstimuotoisen pääteyhteyden yli. Parhaana analogiana 2020-luvulla toimii varmaankin juuri tabletti/älypuhelin, jossa koko näytön täyttää yksi ohjelma kerrallaan, vaikka monia muitakin ohjelmia on päällä yhtäaikaa.
Apuohjelma nimeltä screen mahdollistaa yhdenaikaiset teksti-"ikkunat", joista yksi on kerrallaan näkyvillä pääteyhteydellä. Katso huvikseen manuaalisivua komentamalla:
man screen
Siitähän se lähtee (kopioitu em. komennon antamasta tulosteesta halava-tietokoneella vuonna 2020):
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 terminaalilaite, joka tuotiin markkinoille ennen tämän demolapun kirjoittajaa. Nykyisetkin päätteet emuloivat kyseistä vehjettä kivasti ( http://fi.wikipedia.org/wiki/VT100 ).
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. 2010-luvun loppua kohti tapahtui merkittävää hiljenemistä näiden ohjelmien käytössä, mutta vielä 2024 saatat huomata, että irssi pyörii joillain käyttäjillä ainakin halava-tietokoneessa. (Tein empiirisen kokeen halavassa viimeksi 5.4.2024 klo 9:38 ... kolmella käyttäjällä oli kuin olikin silloin irssi käynnissä. Eivät irkanneet salaa!)
Jos sinulla ei vielä ole palvelimella käynnistettyä screeniä, ensimmäinen lähtee päälle oletusasetuksilla komentamalla:
screen
Komento sellaisenaan ilman argumentteja käynnistää aina uuden instanssin screenistä. Tyypilliseen käyttötarpeeseen yksikin riittää! Aloittelijalle tulee helposti vahingossa käyntiin monta screeniä, mikä aiheuttaa hämmennystä. Tästä tehtiin keväällä 2020 erillinen opetusvideo "Screen-ohjelman käyttöön avustusta aloittelijalle", jossa selitetään aiheesta lisää esimerkin kera. Nyt voi olla hyvä hetki katsoa kyseinen video - ja myöhemmin uudelleen aina niin kauan, kunnes videossa käsitelty ilmiö ei ole enää mikään ongelma.
Kokeillaan nyt komentojen antamista screenissä.
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 jos käytät palvelinta välillä kotikoneelta, välillä mikroluokasta ja välillä läppäristä tai älypuhelimesta 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 pitää antaa argumenttina se, johon halutaan kytkeytyä.
Tarvittaessa katso opastusvideo, joka löytyy Moniviestimestä kurssin erillisvideokansiosta.
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 kuoreen:
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. Kertaa edeltä tarvittaessa!
Manuaalissa luetellaan runsaasti screenin komentoriviargumentteja ja näppäinkomentoja. Tässä on peruskäytön kannalta tärkeimmät näppäinyhdistelmät poimittuna suoraan englanninkielisestä manuaalisivusta. Vapaat suomennokset ja toimintakuvaelma löytyvät alempana. Päällekkäisistä vaihtoehdoista 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. Yleensä pääteyhteyssessio päättyy juuri screenistä irrottautumiseen tällä näppäilyllä ja yhteyden päättämiseen exit -komennolla. Seuraavassa selitetään muut komennot ohjeen kirjoittajan mielipiteen mukaisessa tärkeysjärjestyksessä peruskäytön kannalta.
Näppäily Ctrl-a c luo uuden ikkunan aiempien päälle, ja käynnistää ikkunaan kuoren. Päällimmäisenä olevaa ikkunaa voi vaihtaa luontijärjestyksessä seuraavaan (next) ja edelliseen (previous) 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ä.
Yhteensopivuuden varmistamiseksi voit itsekin asettaa oman screen-sessiosi flown off-tilaan. Jos näppäilyt alkavat tehdä jotakin odotuksesta poikkeavaa, kannattaa tarkistaa, onko vahingossa tullut vaihdettua flow johonkin muuhun kuin off. Varmista, että flow on jälleen off, ja kenties havaittu ongelma näppäilyissä poistuu sillä.
Näppä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. 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 kuoreen kirjoitetulla exit -komennolla ja ikkunoiden välillä vaihtamista. Tämän demon palautustehtävä kirjoitetaan yhdessä screen-ikkunassa etäkoneeseen asennetulla tekstieditorilla, ja sitä kokeillaan toisessa screen-ikkunassa. Palautustiedoston muodosta tarkastaja voi päätellä, että olet käytellyt screeniä ja editoria toivotulla tavoin.
Screenin ymmärtäminen ja opettelu varhaisessa vaiheessa helpottaa toimintaasi jatkossa todella paljon.
Nyt olet saanut haltuun varsin näppärän työkalun etäyhteyksien käyttöön. Kehitä taitojasi screenin kanssa myös jatkossa koko ajan. Otetaan vielä pari elämää helpottavaa kikkaa ensimmäisessä demossa nähtyjen lisäksi ihan vaan motivoivina esimerkkeinä; asiasta kiinnostuneet löytävät lisää omatoimisesti Internetin tutoriaaleista.
Aiemmassa demossa tutustuit interaktiivisen bash-kuoren komentorivin editointiin ja edellisten komentojen hakemiseen komentohistoriasta nuolinäppäimiä käyttäen sekä tiedostojen nimien täydentämiseen tabulaattorilla (muistele ja kertaa tarvittaessa). Pidemmän päälle voi olla hyödyllistä viedä "selkäytimeen" näppäinyhdistelmät, joilla saman voi tehdä siirtämättä käsiä nuolinäppäimille. Nämä samat näppäinyhdistelmät toimivat myös monissa tekstipohjaisissa sovellusohjelmissa, kuten joissakin tekstieditoreissa:
Ctrl-p vastaa nuolta ylös ("p" == previous line) Ctrl-n vastaa nuolta alas ("n" == next line) Ctrl-f vastaa nuolta oikealle ("f" == forward) Ctrl-b vastaa nuolta vasemmalle ("b" == backward) Ctrl-e vastaa end-näppäintä ("e" == end) Ctrl-a vastaa home-näppäintä ("a" == ??) HUOM: Screeniä käytettäessä Ctrl-a on oletuksena komentonäppäin, joten varsinaisen Ctrl-a:n tuottaminen vaatii screenissä tuplanäppäilyn: "Ctrl-a a" eli ensin Ctrl-a ja sitten erikseen a.
Näppäinyhdistelmät vaikuttaisivat periytyvän aiemmista käytänteistä aina 1960- ja 1970-luvuilta saakka. Tarkkaavaisten opiskelijoiden löytämiä linkkejä historiakatsauksiin näppäilyjen osalta:
Kun näitä lähdet kokeilemaan, huomaa, että viereisistä näppäimistä tapahtuu sitten jotain aivan muuta. Suurin osa niistä on erittäin hyödyllisiä toimenpiteitä tehokäyttäjälle, mutta saattavat joskus yllättää varomattoman näppäilijän, joka ei osu alunperin tarkoittamaansa näppäimeen. Tässä potentiaalisimpia yllätysten aiheuttajia:
Ctrl-c tyypillisesti lopettaa käynnissä olevan ohjelman Ctrl-z tyypillisesti pysäyttää käynnissä olevan ohjelman (tätä kokeiltiin demon alussa nano-editorissa) Ctrl-d tyhjän rivin alussa painettuna lähettää hangup-viestin, jolloin mm. kuori loppuu saman tien ikään kuin olisi kirjoitettu komento "exit". Eipähän jatkossa tule yllätyksenä, jos yhteys katkeaa tästä syystä saman tien, vahingossa tai tahallaan. "Lepääminen d-kirjaimen päällä", niin että tulee automaattisesti monta Ctrl-d -painallusta, aiheuttaapi kaikkien screenissä olevien kuori-ikkunoiden sulkeutumisen yksi kerrallaan, viimeisen sulkeutuessa itse screen-ohjelman sulkeutumisen ja seuraavaksi vielä koko pääteyhteyden sulkeutumisen. Rivin keskellä painettuna poistaa osoittimen alla olevan kirjaimen ("d" == delete) Ctrl-j Sama kuin enter, ts. komento lähtee saman tien.. VARO, jne.. Ctrl-m Myös sama kuin enter, ts. komento lähtee saman tien.. VARO, jne.. Ctrl-o Myös sama kuin enter, ts. komento lähtee saman tien.. VARO, jne.. Ctrl-i Sama kuin tabulaattori, eli voi käyttää tiedostonimien täydentämiseen Ctrl-l Eli ällä. Tyhjentää terminaalinäkymän kuten komento clear. ("l" == cLear(?)) Ctrl-s Pysäyttää tekstien saapumisen käyttäjälle päin (terminaalin standardisisääntulo), ei vaikuta palvelimelle päin meneviin näppäilyihin. Voi siis vaikuttaa ikään kuin yhteys olisi "jumissa", vaikkei se oikeasti ole. ("s" == ?? ks. edellä mainittu opiskelijan löytämä linkki historiakatsaukseen) Ctrl-q Jatkaa tekstien näyttämistä käyttäjälle päin, eli "korjaa Ctrl-s:n aiheuttaman näennäisen 'jumittumisen'" ("q" == ?? ks. edellä mainittu opiskelijan löytämä linkki historiakatsaukseen)
Komentorivin editointia tehostavat entisestään mm. seuraavat näppäilyt:
Ctrl-k Leikkaa rivin lopun osoittimesta oikealle päin komentorivin omalle leikepöydälle ("k" == kill) Ctrl-u Leikkaa rivin alun osoittimesta vasemmalle päin komentorivin omalle leikepöydälle ("u" == ??) HUOM: Macissä vaikuttaisi toimivan eri tavoin: Ctrl-u leikkaa koko rivin leikepöydälle riippumatta kursorin sijainnista. Ilmoitelkaahan, jos huomaatte muitakin erilaisuuksia Mac-maailmassa. Ctrl-y Liittää pätkän takaisin komentorivin omalta leikepöydältä. ("y" == yank)
Erityisen tehokas tehokäyttönäppäin on lisäksi seuraava:
Ctrl-r Aktivoi ominaisuuden, jolla komentohistoriasta voi etsiä kauan sitten tehtyä komentoriviä, joka sisältää merkkejä. ("r" == reverse-search) Jos olet vaikkapa 3 päivää sitten tehnyt jotain eksoottista, mikä nyt pitäisi toistaa, niin riittää muistaa muutama leimallinen pätkä kyseisestä komennosta.
Kokeile edellisiä ja koeta saada niistä hyödyllisimmät selkäytimeen. Vaaraa ei ole silloin, kun tiedät, että näppäilysi ei tule suorittamaan sellaista komentoa, joka tuhoaisi dataa poistamalla tiedostoja tai kirjoittamalla niiden päälle.
Luennoilla ja muilla kurssin videoilla todennäköisesti näytettävissä esimerkeissä on tarkoitus käyttää komentoja, joilla käyttöjärjestelmän ja tietokoneen tilannetta voidaan tarkastella kuoresta käsin. Tarkoitus tässä demossa on, että kokeilet näitä työkaluja aivan omin käsin, jotta mieleen jää yleiskuva siitä, millaisia työkaluja esimerkiksi on olemassa. Oman kokemuksen kautta ymmärrät paremmin myös, mistä luennolla milloinkin puhutaan.
Näytä oman kuorisession prosessit:
ps
Tuloste näyttänee jotakuinkin seuraavalle:
[nieminen@itka203 ~]$ ps PID TTY TIME CMD 26837 pts/0 00:00:00 bash 32559 pts/0 00:00:00 ps
Vasemmanpuoleinen sarake (PID) kertoo kunkin prosessin yksilöivän numeron; tästä lisää kurssin mittaan. Toinen sarake (TTY) kertoo sen terminaalin nimen, josta prosessia ohjataan ("tty" == TeleTYpewriter; varsin historiallinen nimike). Kolmas sarake (TIME) kertoo, kuinka paljon prosessi on käyttänyt suoritusaikaa yhteensä. Ylläolevassa tuloste-esimerkissä käyttäjä "nieminen" ei ole käyttänyt kovinkaan paljon yhteisiä resursseja. Tekstipohjaiset sovellukset käyttävät häviävän pieniä määriä aikaa, toisin kuin laskentaintensiiviset sovellukset; tästäkin paljon lisää kurssin mittaan. Viimeinen sarake (CMD) kertoo komennon, jolla kukin prosessi on käynnistetty.
Näytä kaikki tietyn käyttäjän prosessit (korvaa "nieminen" vaikka omalla tunnuksellasi tai millä vaan):
ps -u nieminen
Näytä kaikkien käyttäjien prosessit ("e" == every??):
ps -e
Näytä enemmän tietoja ("f"==full) yhden käyttäjän prosesseista:
ps -f -u nieminen
Tämä tuloste kertoo prosessin ID-tunnuksen ja komennon lisäksi myös muita tietoja. Saattaa näyttää vähän tältä:
UID PID PPID C STIME TTY TIME CMD nieminen 1023 26837 0 20:12 pts/0 00:00:00 ps -f -u nieminen nieminen 14995 1 0 Feb19 ? 00:00:00 SCREEN nieminen 14996 14995 0 Feb19 pts/1 00:00:00 /bin/bash nieminen 15010 14995 0 Feb19 pts/2 00:00:00 /bin/bash nieminen 26836 26806 0 19:16 ? 00:00:00 sshd: nieminen@pts/0 nieminen 26837 26836 0 19:16 pts/0 00:00:00 -bash
Ensimmäinen sarake (UID) ilmoittaa nyt käyttäjän, jonka oikeuksin prosessia suoritetaan. Toinen sarake (PID) yksilöi prosessin. Kolmas sarake (PPID) ilmoittaa sen prosessin, joka on pyytänyt rivillä näytetyn prosessin käynnistymistä, tämän nimi on luontevasti vanhempiprosessi (ppid = "parent process id"). Neljäs sarake (C) kertoisi, kuinka paljon prosessoriaikaa kukin prosessi vie; tässä esimerkissä suoritusaika ei vaikuttaisi kovin relevantilta kysymykseltä. Viides sarake (STIME) kertoo, mihin aikaan prosessi on käynnistetty. Kuudes sarake (TTY) on jälleen terminaalin nimi. Seitsemäs (TIME) kertoo jälleen, paljonko prosessoriaikaa prosessi on vaatinut. Täydemmässä tulosteessa viimeinen sarake (CMD) on myös täydellisempi. Se kertoo pelkän komennon lisäksi myös argumentit, jotka komentorivillä on annettu.
Valitsimia voi yhdistellä. Esimerkiksi näytä enemmän tietoja kaikkien käyttäjien prosesseista:
ps -f -e
Tämän komennon tulosteessa osa riveistä on muiden normaalien käyttäjien prosesseja, mutta osa puolestaan on järjestelmän palveluiden prosesseja, jotka toimivat käyttäjäoikeuksin. Tällä tavoin voidaan rajata palveluiden oikeuksia samalla tavoin kuin normaalien käyttäjienkin. Kaikkien palveluiden ei missään nimessä tarvitse päästä käsiksi kaikkialle, koska ensinnäkin jokainen avoimeksi jätetty ovi on potentiaalinen tietoturva-aukko. Sen sijaan kukin palvelu kannattaa suunnitella käynnistettäväksi sellaisen käyttäjätunnuksen alle, jolla on minimaaliset oikeudet täsmälleen kyseisen palvelun toteuttamiseksi. Esimerkiksi WWW-palvelimella ei missään nimessä saisi olla kirjoitusoikeutta koko järjestelmään. Sen toiminta on syytä rajata esimerkiksi httpd -nimiselle käyttäjälle tai ryhmälle määrättyihin oikeuksiin.
Tuloste alkaa todennäköisesti seuraavalla rivillä:
UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jan28 ? 00:00:16 /sbin/init root 2 0 0 Jan28 ? 00:00:01 [kthreadd]
Tuo käyttäjä root on kaikkivoipaisin käyttäjä, jonka oikeuksin voi tehdä järjestelmässä mitä vain. Prosessi, jonka id-numero on 1 ja komento /sbin/init on erikoisroolissa: käynnistyksen yhteydessä käyttöjärjestelmä käynnistää kyseisen init-prosessin, ja kaikki muut sittemmin käynnistetyt prosessit ovat sen lapsia, lapsenlapsia tai myöhempiä jälkeläisiä. Myös prosessi 2, käyttöjärjestelmän säikeitä hallitseva palvelu, on erikoisroolissa (järjestelmä on käynnistänyt sen "ilman vanhempaa" eli ppid==0). Kaikki loput prosessit ovat jomman kumman prosessin (1 tai 2) jälkikasvua. Voinet verifioida tämän saamastasi tulosteesta.
Kokeile vielä seuraavaa epästandardia laajennosta, joka näyttää oikeanpuoleisessa sarakkeessa kauniina "ASCII-grafiikkana", mikä prosessi on minkäkin toisen prosessin lapsi tai vanhempi:
ps -e -f --forest
Prosessin 2 (kthreadd) lapsia ovat laitteistoa käsittelevät palvelut. Prosessin 1 lapsia ovat vähemmän laiteläheiset palvelut. Yksi esimerkki on sshd -palvelu. Se odottaa salattuja pääteyhteyksiä kuten se, jota tällä hetkellä käyttelet.
Vielä yksi tapa tutkia prosesseja... komenna:
top
Top näyttää reaaliaikaisen tilanteen prosesseista ja niiden aiheuttamasta resurssikuormasta. Topista pääsee pois näppäilemällä q.
Lisää tietoa ja kustomointimahdollisuuksia näkee tietenkin seuraavasti:
man ps man top
Unixmaisesta tiedostojärjestelmästä toteutuksineen puhutaan kurssilla myöhemmin lisää, mikäli ehditään. Katsotaan käyttäjän näkökulmaa tässä vaiheessa etäkoneen kuoressa.
Huomautuksia Jyväskylän yliopistossa vuodesta 2019 alkaen:
Seuraavat ohjeet siis olettavat, että päätät kokeilla käytäntöä äskeisten huomioiden mukaisessa paikassa. Kotihakemistossa näyttää siltä, että kaikilla tiedostoilla on oikeuksina rwxrwx--- ja tämä on siis yhteensopivuussyistä johtuvaa hienoista harhaa.
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 viiva - 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 vastaavat 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 mutta eivä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.
Tarkempia tietoja tiedostosta saa komennolla stat esimerkiksi seuraavasti:
stat hmm.txt
Tuloste on jotakin seuraavanlaista:
File: `hmm.txt' Size: 4 Blocks: 8 IO Block: 4096 regular file Device: fd09h/64777d Inode: 786456 Links: 1 Access: (0644/-rw-r--r--) Uid: (29067/nieminen) Gid: ( 100/ users) Access: 2014-05-05 14:56:31.509949717 +0300 Modify: 2014-04-03 16:11:07.469291072 +0300 Change: 2014-04-03 16:11:07.469291072 +0300
Jätetään mielen päälle hautumaan, että tiedostoon liittyy oikeuksien (Access) ja oikeuksiin liittyvien omistajien (Uid, Gid) lisäksi mm. aikaleimoja viimeiseen käyttöhetkeen (Access), sisällön muutoshetkeen (Modify) ja metatietojen kuten käyttöoikeuksien muutokseen (Change). Tiedoston sijaintia laajemman struktuurin sisällä ilmoittaa yksilöllinen i-solmun numero (Inode). Joihinkin näistä tiedoista palataan kurssin tiedostojärjestelmiin liittyvässä osiossa, riippuen mihin tällä kurssikerralla ehditään.
Mikä on tiedosto? Tähän mennessä varmaan ymmärretään, että se on jonkinlainen kokonaisuus, jolla voi olla nimi, yksilöllinen osoite hakemistopuussa, omistaja, käyttöoikeuksia, pituus sekä aikaleimoja käyttö- ja muunteluajankohdista.
Yleissivistystä lienee, että tiedosto voi sisältää esimerkiksi tekstin, kuvan, videopätkän tai suoritettavan ohjelman. Okei. Mutta miten esimerkiksi tekstitiedosto, kuvatiedosto ja suoritettava ohjelmatiedosto tarkkaan ottaen eroavat toisistaan?
Nyt katsotaan, miten pystyt elämässäsi tästä eteenpäin aina selvittämään tasan tarkkaan, mitä jokin tiedosto pitää sisällään. POSIX lupaa, että yhteensopivassa järjestelmässä toimii seuraava komento:
od tiedostonimi
Kokeile esimerkiksi:
od /bin/true
Tämä komento od eli "octal dump" tulosti nyt tiedoston /bin/true sisällön tasan tarkkaan siten, kuin se on, käyttäen oktaalinumeroita datan osoitteelle tiedoston alusta lukien (vasen sarake) sekä itse tiedolle (loput sarakkeet). Oktaalinumerot eivät välttämättä ole hauskin tapa katsoa tiedostoja, joten tällä kurssilla käytämme suosiolla epästandardia komentoa, joka suorakäyttökoneiltamme löytyy. Eli teemme POSIXista huolimatta seuraavaa:
hexdump -C /bin/true | less
(Muistat jo varmasti (?), että less näyttää putken vasemmalla puolella olevan komennon tulosteen vähän kerrassaan ja siten, että tulostetta voi selata edestakaisin.)
Melkein saman saisi POSIXin mukaisesti komennolla od -A x -t x1, mutta nyt kun meilllä on käytössä hexdump -C niin käytetään sitä, kun on mukavampi ja nätimpi tuloste.
Tämä hexdump, kun sille antaa argumentin -C eli viiva ja iso C-kirjain (C=="canonical") ja jonkin tiedoston osoitteen, niin se näyttää tiedoston sisällön kohtalaisen nätissä formaatissa. Tässä on kopioituna ensimmäiset rivit, jotka tulostuivat äskeisestä komentoesimerkistä tätä ohjetta kirjoitellessa jossain vaiheessa 2010-lukua:
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 02 00 3e 00 01 00 00 00 70 0f 40 00 00 00 00 00 |..>.....p.@.....| 00000020 40 00 00 00 00 00 00 00 20 5a 00 00 00 00 00 00 |@....... Z......| 00000030 00 00 00 00 40 00 38 00 08 00 40 00 20 00 1f 00 |....@.8...@. ...| ...
Voit kokeilla, mitä tulostuu tänään, kun teet tätä harjoitusta. Jotakin voi olla eri tavoin, mutta tietyt asiat ovat varmasti samojakin.
Jokaisen rivin vasen sarake kertoo datan sijaintipaikan heksalukuna tiedoston alusta alkaen. Sitten on aina 16 kappaletta 8-bittisiä tavuja ja lopussa vielä sarake, jossa nämä 16 tavua on tulostettuna, mikäli ne sattuvat olemaan "selväkieliseen" ASCII-merkistön osuuteen kuuluvia eli tulostettavia (engl. printable) merkkikoodeja.
Tämän esimerkin tapauksessa, kuten aika usein, tiedoston sisällön ensimmäisistä tavuista voi päätellä paljon siitä, mitä koko tiedosto pitää sisällään. Tässä tapauksessa ensimmäiset tavut ovat heksana 7f 45 4c 46, mihin sisältyvät numerokoodit 0x45, 0x4c ja 0x46 voidaan tulkita ASCII-merkistön mukaan merkkijonoksi ELF. Tiedosto ei todennäköisesti liity pitkäkorvaisiin haltioihin tai tonttuihin (engl. "elves", yksikkö "elf"), vaan mitä todennäköisimmin se sisältää ELF-muotoon tallennettua konekielistä ohjelmakoodia (ELF == "Executable and Linkable Format).
Voit selailla tiedostoa edestakaisin less-ohjelmassa totuttuun tapaan eli nuolilla ja PageUp, PageDown -näppäimillä. Tutki vaikka silmämääräisesti, löytyykö tiedoston sisältä mahdollisesti muitakin lukukelpoisia tekstejä kuin aivan alussa olevat merkit ELF.
Olennaista on, että nyt tiedät, miten pystyt katsomaan tavu tavulta, bitti bitiltä, mitä mikäkin tiedostosi pitää sisällään. Voit huvikseen tutkia, miltä tietokoneen mielestä näyttävät esimerkiksi tekstitiedostot, kuvatiedostot, docx-dokumenttitiedostot, zip-paketit... (kahdessa viimeksimainitussa on jotakin yhteistä, muuten!).
Työkaluohjelma file kokeilee heuristisesti, mikä tiedoston todennäköinen formaatti on:
file /bin/true
Kun on selvinnyt, että tämä /bin/true on ohjelmatiedosto, voidaan sen sisältöä tarkastella myös seuraavasti:
objdump -x /bin/true | less
Tulosteessa on kaikenlaisia toistaiseksi enemmän tai vähemmän mystisiä tekstejä ja heksanumeroita; jätetään toistaiseksi hautumaan.
(Reunahuomautuksena... tämä true -ohjelma on POSIX-standardin edellyttämä apuohjelma, joka manuaalin mukaan "ei tee mitään, onnistuneesti", tarkista vaikka komennolla man true... Se on siis vähän niinkuin jotkut meidän opiskelijat, mutta et Sinä, koska olet ilmeisesti tekemässä tätä demoa, mikä on paljon enemmän kuin ei mitään...)
"Emacs tai Vim - muuten ei ole nörtti"
(lentävä lause henkilökunnan kahvihuoneessa; alkuperä tuntematon)
Normaaliolosuhteissa käytämme ohjelmakoodin ja järjestelmäylläpidon tehtäviin työpaikan tarjoamia tai itse hankittuja graafisia työkaluja, joihin esimerkiksi IDEt ja tekstieditorit lukeutuvat. Materiaalit kehitetään ja testataan lokaalisti, ylläpidetään jaetussa versionhallinnassa ja testatut tuotantoversiot jaellaan aikataulun mukaisesti asiakkaille. Monien nykyisten tuotteiden tapauksessa tämä tarkoittaa asiakkaan tuotantopalvelimessa toimivan palvelinohjelmiston päivittämistä.
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ää. Muun muassa näitä tilanteita varten tällä kurssilla totutellaan tekstieditointiin päätteellä. Kehittyneempien tekstieditorien käyttöliittymät on myös kehitetty lähtökohtaisesti erinomaisen tehokkaiksi. Modernimmissa IDEissäkin on usein mahdollista säätää asetuksista näppäinkomennot vastaamaan "vanhojen kunnon" tekstieditorien tyyliä, jolloin mm. ei tarvitse juurikaan siirtää käsiä näppäinten keskeltä hiirelle, eikä edes nuolinäppäimillekään asti! Tekstin tuottaminen ja siirtely paikasta toiseen voi tällöin tulla huomattavan paljon nopeammaksi toimenpiteeksi kuin ajattelu, jota ohjelmien luominen ensisijaisesti vaatii.
Mikäli käytät enemmän aikaa koodin tekniseen kirjoittamiseen kuin ratkaisun keksimiseen, käytät melko varmasti vääriä työkaluja tai et osaa vielä hyödyntää kalustoa niin tehokkaasti kuin olisi mahdollista!
Alkupuolella tätä demoa nähtiin nano, joka on helppo ottaa käyttöön ja ymmärtää, mutta jossa ei oikeastaan ole juuri mitään muita ominaisuuksia. Oikeasti tekstin editointi vaatii järeämpää kalustoa.
POSIX-standardi määrää, että yhteensopivasta järjestelmästä löytyy vähintään yksi "visuaalisesti orientoitunut" tekstieditori, joka käynnistyy komennolla vi ja toimii aina vähintään juuri tietyllä tapaa. Käytännössä nykyään esimerkiksi meidän suorakäyttökoneillamme tuo komento käynnistää laajennetun editorin nimeltä vim eli "Vi IMproved". Vim on hyvin käyttökelpoinen ja tehokas tekstieditori, mutta sen käyttöönotossa on tietenkin oppimiskäyrä toisin kuin Nanossa.
Toinen hyvin kehittynyt ja tehokas tekstieditori on emacs, jonka saa helposti asennettua moniin unixmaisiin käyttöjärjestelmiin - esimerkiksi meidän suorakäyttökoneillamme se löytyy valmiiksi asennettuna.
Periaatteessa hätätilanteessa voi käyttää aivan aluksi esiteltyä Nanoa, jolla miten kuten pystyy tekemään tämän ja myöhemmät demot tällä kurssilla, vaikkakaan ei kovin tehokkaasti.
Pidemmän päälle suositeltavaa (jopa ajankäytön suhteen) on valita joko vim tai emacs ja perehtyä sen ominaisuuksiin yksi kerrallaan. Tämän demon kirjoittajan oma suosikki on ilman muuta Emacs, mutta sotien välttämiseksi tuli nyt tälläkin kertaa mainittua Vim ensiksi.
Keväällä 2016 näitä demoja oli tekemässä myös syventävän kurssin "Linux-palvelimen ylläpito" opiskelijoita. Heille suosittelen vimiä, koska se löytyy emacsia useammin palvelimilta. Kyseinen porukka myös unohtakoon sen nanon ihan suosiolla! Sen pitää olla taaksejäänyttä elämää siinä vaiheessa, kun ryhdytään oikeasti hommiin. Oikeastaan: Me voitais jo tällä kurssilla ryhtyä oikeasti hommiin, unohtaa Nano ja opetella Emacs tai Vim!
Lopuksi mainittakoon automaattinen tekstieditointi, joka voi joskus tarjota nopeimman ja helpoimman keinon etsi- ja korvaa -tyylisiin tai muihin mekaanisiin tekstinkäsittelytehtäviin. Tyypillisiä työkaluja ovat ainakin POSIX-standardin määrittelemät sed ja awk. Näihin tuskin ehditään perehtyä tällä kurssilla ainakaan muutamaa esimerkkiä pidemmälle. Idea on, että näillä työkaluilla voi etsiä ja korvata merkkijonon kerralla vaikka 10000 tekstitiedostosta, joissa on yhteensä teratavu materiaalia. Käsipelillä menisi ikuisuus, ja esimerkiksi usean gigatavun kokoista tekstitiedostoa tuskin pystyisi edes avaamaan tekstieditorissa.
Sellainen editori on olemassa kuin Nano. Me ei käytetä sitä, koska se on tarkoitettu niin alussa olevalle vasta-alkajalle, että emme tunnusta tällä opintojaksolla kenenkään olevan sellainen. Jos kaverisi mummon pitää käyttää tekstieditoria pääteyhteydellä, neuvo hänelle Nano, mutta se siitä.
Kun neuvot kaverin mummolle Nanoa, niin näillä hän pääsee alkuun: Melkein kaikki toiminnot näkyvät ruudun alalaidassa. Control-näppäimen painaminen kirjoitetaan lyhyesti väkäsellä eli sirkumfleksilla, esimerkiksi ^G tarkoittaa samaa kuin näppäily Ctrl-g. Kyseinen näppäily antaa tarkemman ohjesivun, jonka perusteella varmaan kaverin mummokin pärjää tarvittaessa.
Huomionarvoinen lisätarkennus liittyy useamman peräkkäisen rivin kopiointiin: Mummon pitää mennä riville, josta alkaa kopioitava pätkä. Sitten hänen pitää tuhota ("kill") Ctrl-k:ta painamalla peräkkäisiä rivejä niin paljon kuin hän haluaa lopulta kopioida. Peräkkäin tuhotut rivit tallentuvat tuhoamispuskuriin ("kill buffer"), jonka hän saa takaisin näppäilemällä Ctrl-u ("un-kill"(?)). Sitten hän menee kohtaan, johon hän haluaa laittaa kopion ja näppäilee toisen kerran Ctrl-u. Kopio on valmis ja mummo voi jatkaa editointia sitä eteenpäin.
Ohjelmakoodia on syytä käsitellä editorilla, joka tukee kielen syntaksin mukaista värikoodausta. Jopa nanossa on jonkinlainen köpsähtävä perustuki. Ohjeita siihen ei anneta tässä, koska jos kaverisi mummon pitää alkaa editoida ohjelmakoodia pääteyhteydellä, niin sitten hänelle kannattaa opastaa Vimin tai Emacsin käyttö.
Täällä ei jäädä entry-levelille: Opetellaan käyttämään jompaa kumpaa tai molempia tehokkaammista editoreista, vaikka niiden oppimiskäyrä on aluksi jyrkempi.
Emacs -tekstieditorin ensimmäinen versio on peräisin vuodelta 1976. Kuinka hyväksi spesifiin tarkoitukseen tehty ohjelmisto voi kehittyä 48 vuodessa, kuten emacs vuoteen 2024 mennessä? Vinkki: aika hyväksi. Vuonna 2024 meidän suorakäyttökoneellemme on asennettu versio "GNU Emacs 24.3.1". Lisätietoa emacsista esimerkiksi Wikipediasta http://en.wikipedia.org/wiki/Emacs ja viralliselta sivulta https://www.gnu.org/software/emacs/
Tämä editori käynnistyy komennolla:
emacs
Ensimmäisellä käynnistyskerralla emacs havaitsee, ettet ole aiemmin käynnistänyt sitä, ja tarjoilee ohjeita. Ota vastaan, jos siltä tuntuu. Tässä demolapussa pystytään antamaan vain kriittisimmät selviytymisohjeet. Oletusasennuksessa emacs tunnistaa 2000 erilaista komentoa, ja siihen voi ohjelmoida lisää ominaisuuksia miten tahtoo... valmiita lisälaajennuksia on netti pullollaan.
Selviytyminen, osa 1: Emacsin saa suljettua näppäilemällä Ctrl-x Ctrl-c eli ensin Control ja x-näppäin ja sen perään Control ja c. Muistaakseni on ihan kiva tietää, miten ohjelman saa suljettua.
Selviytyminen, osat 2 jne: Emacsissa voi olla auki monta tiedostoa yhtä aikaa niin sanotuissa puskureissa (engl. buffer). Paljolti perustoiminnot perustuvat yhden tai muutaman näppäimen näppäinyhdistelmiin, jotka laukaisevat toimenpiteitä. Melkein jokainen näppäimen painallus laukaisee erikseen ohjelmoitavissa olevan toiminnon, yksinkertaisimmillaan vastaavan merkin lisäämisen näkyvissä olevaan puskuriin osoittimen kohdalle.
Emacsissa on oma tutoriaali, jonka saa päälle näppäilemällä Ctrl-h t eli ensin Control ja h-näppäin ja sen jälkeen ihan vain t-näppäin. Ohje koostuu tekstitiedostosta, joka avautuu suoraan editoriin itseensä ja käytännön tekemisen kautta opastaa alkuun.
Emacsin tutoriaali aloittaa selittämällä englannin kielellä saman, mitä äsken luit suomeksi. Siitä vain sitten käymään tutoriaalia pidemmälle. Englannin kieltä meidän pitää opetella lukemaan joka tapauksessa. Tutoriaaleja meidän pitää oppia löytämään ja hyödyntämään. Isojen osaamistavoitteiden äärellä siis tämäkin osa harjoitusta!
Esimerkkinä joitakin aivan yksinkertaisimpia komentoja suomeksi kuvattuna tässä. Omia muistiinpanoja kannattaa tutoriaaleista tehdä esimerkiksi tällä tavoin:
Loput 2000+ komentoa eivät mahdu tähän ohjeeseen; lisää manuaalissa https://www.gnu.org/software/emacs/manual/html_node/emacs/ ja lukuisissa tutoriaaleissa, joita voi etsiä Internetistä vaikkapa hakusanalla "emacs tutorial".
Myös vi -editorin ensimmäinen versio on julkaistu vuonna 1976. Toistetaan siis kysymys, että kuinka hyväksi spesifiin tarkoitukseen tehty ohjelmisto voi kehittyä 48 vuodessa, kuten vi vuoteen 2024 mennessä? Tähän vastaus on sama kuin emacsin suhteen. Vinkki: aika hyväksi. Alkuperäinen vi on myös standardoitu POSIXissa. Matkan varrella, vuosina 1987-1993, syntyi nykyisin suosittu laajennettu, eikä täysin standardin mukainen "Vi IMproved", joka esimerkiksi meidän suorakäyttökoneiltamme löytyy. Lisätietoa esimerkiksi Wikipediasta http://en.wikipedia.org/wiki/Vim_%28text_editor%29 ja Vimin omilta sivuilta http://vim.sourceforge.net/ .
Selviytyminen, osa 1: Vimin saa suljettua näppäilemällä ESC : q ! <Enter-näppäin>. ESC siirtää vimin tilaan, joka odottaa komentoja, jos se oli vahingossa jossain muussa tilassa. Sitten annetaan komento :q ("q"==quit) ja kirjoitettu komento suoritetaan enterillä. Jos on tallentamattomia muutoksia, joita ei haluta säilyttää, niin loppuun pitää laittaa vielä huutomerkki ! ("!"=="tosissaankin"). Muuten vim ilmoittaa kohteliaasti, jos sinulla on tallentamattomia muutoksia.
Selviytyminen, osat 2 ja niin edelleen: Vimissä on erikseen komentotila (normaalitila) ja kirjoitustila. Lisäksi siinä on muita tiloja erityistarpeeseen, kuten "visuaalinen tila" tekstin maalaamiseen ja leikkaamiseen leikepöydälle. Idea on tehdä tekstin poistot, leikkaamiset, liimaamiset ja muut vastaavat muutokset komentotilan kautta, ja kirjoittaa uutta tekstiä tarvittaessa kirjoitustilassa. Kirjoitustila menee päälle esimerkiksi näppäilyllä i ("i"==insert). Kirjoitustilasta pääsee takaisin komentotilaan näppäilemällä ESC.
Varoitus (variaatio copy-pastaamisesta pääteyhteysikkunaan): Kun mahdollisesti leikkaat jostain tekstiä ja liimaat sen pääteyhteydessä, niin ole varovainen myös Vimin kanssa. Jos vim on komentotilassa, niin pääteikkunaan copy-pastettua tekstiä käsitellään tietysti merkki kerrallaan ikään kuin antaisit sille näppäilemällä komentoja! Tämä saattaa aiheuttaa virheiden ilmaantumista, pahimmillaan editoitavan tekstin muuttumista, häviämistä ja Vimin asetusten muuttumista! Kaikki tämä kun tehdään näppäilemällä yhden merkin mittaisia komentoja tehotyökalu-Vimiin. Copy-pastella on siis erittäin helppo saada siirrettyä kursoria ja poisteltua tekstipätkiä sieltä täältä. Ei ole mitään hätää, kun muistat Demossa 1 olleet varoitukset ja olet huolellinen.
Vimillekin löytyy sen oma pika-tutor, jonka saa suorakäyttökoneella käyntiin komentamalla kuoressa:
vimtutor
Ohje koostuu tekstitiedostosta, joka avautuu vim -editoriin. Kyseinen ohje lupaa opettaa Vimin peruskäytön puolessa tunnissa. Vanhana Emacs-käyttäjänä kokeilin tätä itse vuonna 2017, ja näin siinä voi tosiaankin käydä. Eli ajankäytön suhteen kumminkin aika minimaalista suhteessa loppuelämäksi saatavaan hyötyyn!
Vim -editorin erilaiset toimintatilat luultavasti hämmentävät aluksi tottumatonta käyttäjää, koska aiemmin tutuissa graafisissa editoreissa ei yleensä ole tällaista tiloihin perustuvaa toimintalogiikkaa. Esimerkiksi komentotilassa näppäily x hävittää osoittimen alla olevan merkin. Toki sen saa takaisin näppäilemällä u niinkuin "undo". Vim (kuten Emacs) on suunniteltu nopeaksi editoriksi. Oikein käytettynä tekstin muokkaaminen on todella tehokasta, mutta aluksi sen opettelu mahdollisesti vaatii graafisia kollegoitaan enemmän aikaa ja vaivaa. Monen selkäytimeen on ehtinyt juurtua hiiren käyttäminen, mutta nyt hiiri jätetään hyllylle ja pidetään sormet lähellä kymmensormijärjestelmän perusriviä "ASDFGHJKL" ja kaikki taika tapahtuu parin millin sormiliikkeillä sekä Emacsissa että Vimissä.
Tarkkaile, ettei Caps-Lock ole vahingossa jäänyt päälle kun käytät Vimin normaalitilaa. Isoilla kirjaimilla on tässä väliä. Tiettyjä aloittajalle riittäviä komentoja. Jälleen esimerkki muistiinpanoista, joita voisit itsekin tehdä tutoriaalin kanssa harjoitellessasi:
a siirtyy lisäystilaan kursorin oikealle puolelle. A siirtyy lisäystilaan nykyisen rivin loppuun. i siirtyy lisäystilaan kursorin kohdalle. I siirtyy lisäystilaan nykyisen rivin alkuun. h,l liikkuu vasemmalle, oikealle. Rivin alussa/lopussa ei siirrytä automaattisesti toiselle riville! j,k siirtyy seuraavalle, edelliselle riville. u palauttaa muutoksista, "undo" x poistaa kursorin kohdalla olevan merkin. 0 (numero nolla) siirtää kursorin rivin alkuun. $ (dollarimerkki) siirtää kursorin rivin loppuun. o,O Luo uuden rivin nykyisen rivin alapuolelle, yläpuolelle. Siirtää kursorin sinne lisäystilassa. w,e siirtää kursorin seuraavan sanan alkuun, loppuun. : siirtyy Vimin komentoriville. Pois pääsee painamalla askelpalautinta tai ESC näppäintä. v siirtyy visuaaliseen-/valintatilaan.
Osaan edellisistä komennoista saa lisämausteita kirjoittamalla numeroita ennen komentoa, esimerkiksi 3j siirtyy kolme riviä alemmaksi.
Valintatilassa editori näyttää kursorin ja sen paikan välisen alueen korostettuna, jossa kursori oli valintatilaan siirryttäessä, jolloin tämän korostetun alueen voi vaikka kopioida tai poistaa. Valintatilassa painamalla y editori kopioi korostetun alueen, painamalla d leikkaa sen (poistaa samalla kun kopioi). Täten leikepöydälle kopioidun alueen voi liimata uuteen paikkaan näppäilyllä p.
Vim on monipuolinen editori, josta löytyy kasa muitakin tiloja sekä komentoja, oma skriptikieli sekä monia muita herkkuja tehokäyttäjälle.
Joidenkin mielestä Emacs on paras, joidenkin mielestä Vim. Molemmat ovat tekstin editointiin riittäviä, mutta jompikumpi on osattava, että voi osallistua keskusteluun :).
Molemmat editorit ovat kokeneen käyttäjän käsissä luultavasti tehokkain toistaiseksi keksitty tapa siirtää tekstiä henkilön pään sisältä tietokoneelle.
Molempien ero esimerkiksi nano -editoriin tai Windowsin notepad -editoriin on suurin piirtein sama kuin Boeing 777:n ero paperilennokkiin.
Kokeile ennakkoluulottomasti. Saatat jopa alkaa haluta Emacsin tai Vimin näppäinkomennot käyttöön muissakin editoreissa ja IDEissä. Ne ovatkin monissa työkaluissa laitettavissa päälle.
Isojen tekstimassojen käsittely kannattaa automatisoida. POSIX-yhteensopivassa järjestelmässä on aina kaksi tarkoitukseen soveltuvaa työkalua: sed ja awk.
Tiedonjanoinen voi etsiä netistä hakusanoilla "sed examples" ja "awk examples". Löytyi ensimmäisenä tällaiset, kun kokeilin:
# Replace ham with cheese in file.txt except in the 5th line: sed '5!s/ham/cheese/' file.txt # Print 3rd and 4th column from a tab-separated table awk '{print $3 "\t" $4}' marks.txt
Lisäesimerkkinä vielä opettajan oma pieni Bash-komentorivi, joka riisuu tietyn aputyökalun tekemästä HTML-tiedostosta pari juttua niin, että jäljelle jäävän sisällön voi julkaista Moodlen kurssialueen sivulle copy-pastena Moodlen HTML-editointitilassa:
awk '/<body>/, /<\/body>/' alkup.html | head -n-2 | tail -n+3 > moodleen.htmbody
Tämä syntyi heti, kun olin muutaman kerran manuaalisesti ottanut HTML:n auki, maalannut sieltä alueen kopioitavaksi Moodleen, ja todennut, että siihen käytetyt sekunnit ovat liian ärsyttäviä ja turhia sekunteja.
Kyseinen rivi taas on osa skriptiä, joka pullauttaa automaattisesti Moodle-kelpoiset tiedostot git-versionhallinnassa olevista materiaaleista, joita on tehokasta tuottaa ReST-muotoisena mark-uppina Emacsilla. Ajan voi käyttää nyt ajatteluun ja materiaalin kirjoittamiseen, eikä turhaan klikkailemiseen. Ongelma ratkaistu ATK:lla.
Tämän kurssin sisältöön ei mahdu automaattisen tekstieditoinnin opettelua, vaikka se mukavaa olisikin. Riittää muistikuva siitä, että tällaiset työkalut löytyvät standardina apuohjelmana. Toivottavasti tästä jää myös kiinnostus kokeilla näitä joskus rutiininomaisten asioiden automatisoimiseksi. Annetaan täten ideoita ja keinoja, jotta jokainen voi halutessaan kehittää itseään päivittäin koko asiantuntijauransa ajan!
Varioidaan ensimmäisessä demossa tehtyä palautustehtävää. Tällä kertaa automatisoidaan toimenpide, eli tehdään tekstieditorilla noin seitsemän riviä pitkä komentojonotiedosto eli kuoriskripti, joka tuottaa halutunlaisen tulosteen.
Tavoite on, että käytät screen -ohjelmaa niin, että voit näppärästi tehdä yhdessä screen-ikkunassa muutoksia skriptiin ja toisessa screen-ikkunassa kokeilla, miten nykyinen versio toimii.
Jumppaa siis mielellään screenin ja tekstieditorin käyttö näppäräksi ennen palautustehtävän tekemistä. Muista katsoa screenin käytöstä tehty ohjevideo varsinkin, jos homma tuntuu, ettet oikein hahmota sen hyötyjä tai jos sen käyttely ei tunnu näppärältä.
Mikä ja miksi on skripti? Skripti (engl. script) eli "komentojono" tai "komentoriviohjelma" on kuoren, esimerkiksi bashin, ymmärtämän syntaksin mukainen ohjelma, jonka kuori lukee, tulkkaa ja suorittaa rivi riviltä. Laajemmin ajateltuna skriptiksi voitaisiin sanoa millä tahansa tulkattavalla kielellä (esimerkiksi Python, Perl, Lua, Php, Matlab, ...) 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 ja alasajo, lokit, päivitykset, varmuuskopioinnit, ohjelmistoasennukset ...) 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. Kuoriskriptit voivat myös ottaa normaalien ohjelmien tapaan argumentteja, ja niihin voidaan kirjoittaa normaaleja ohjelmointirakenteita kuten muuttujia, aliohjelmia, silmukoita ja ehtoja. Kuoriskriptit ovat todellinen järjestelmäylläpitäjän tehotyökalu.
Aloitetaan harjoitteet yksinkertaisesta päästä: Käytä valitsemaasi tekstieditoria yhdessä screen -ohjelman tarjoamassa ikkunassa ja kirjoita peräkkäisille riveille allaolevassa tehtäväkuvauksessa tarvittavat komennot. Käytä toista screen -ohjelman tarjoamaa ikkunaa skriptin kokeilemiseen ja tulosteen oikeellisuuden tarkastamiseen.
Ensimmäisellä rivillä skriptissä tulee ilmoittaa risuaidan ja huutomerkin jälkeen kuoriohjelman eli meidän esimerkeissämme bashin sijainti tiedostojärjestelmässä. Skriptisi tulee siis alkamaan jotakuinkin näin:
#!/bin/bash whoami > kj24_demo2_tuloste.txt
Huomaa, että tiedoston kj24_demo2_tuloste.txt aiempi sisältö häviää, kun ohjataan tuloste väkäsellä. Jatkaminen edellisen sisällön perään edellyttää kahden väkäsen käyttöä. Välilyönnit tulkitaan erotinmerkeiksi jne., joten ole edelleen perusvarovainen ja koeta etukäteen hahmottaa mitä suorituksissa tapahtuu.
Oikeassa elämässä sitten on syytä opetella 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 ja muuta kaunista. Mutta ei sekoiteta päätä vielä sillä, vaan kovakoodataan nyt tulostetiedoston nimi vaikkapa juuri kj24_demo2_tuloste.txt.
Skripti pitää ajaa oleskeluhakemistosta, eli komentamalla:
./demo2_skripti.sh
Tätä varten tiedoston käyttöoikeuksiin pitäisi lisätä suoritusoikeus käyttäjälle itselleen käyttämällä komentoa chmod sopivasti. Tällä hetkellä (tilanne keväästä 2019 alkaen) Jyväskylän yliopiston suorakäyttökoneissa näin ei kuitenkaan voida edes tehdä oman kotihakemiston sisällä, koska kaikilla ison NAS-levymme tiedostoilla, skripti mukaanlukien, näyttää olevan vähän liikaa käyttöoikeuksia. Suoritusoikeuskin on siis jo valmiina kaikilla tiedostoilla. Normaaliolosuhteissa kannattaisi olla antamatta suoritusoikeutta muille kuin varmuudella suoritettavaksi tarkoitetuille tiedostoille.
Kokeile skriptiä yhdessä screen-ikkunassa ja katso, että tuloste vastaa speksiä, esimerkiksi ihan tulostuskomennolla:
cat kj24_demo2_tuloste.txt
Editoi tarpeen mukaan skriptiäsi siinä screen-ikkunassa, jossa editori on auki. Opettele vaihtelemaan näppärästi screen-ikkunoiden välillä.
Kun ajat skriptisi, sen suorituksesta pitää syntyä täsmälleen seuraavanlainen tulostiedosto (huomaa pienet erot demossa 1 tehtyyn):
Tulostiedoston nimi on kj24_demo2_tuloste.txt. Sen ensimmäisen rivin sisältönä on jälleen whoami -ohjelman tuloste.
Seuraavalle riville tulee komennon pwd tuloste. Oletetaan että olet toisen demon vastauksille tekemässäsi hakemistossa, ja kyseisen hakemiston nimihän tuosta pitäisi täten tulostua, siis esimerkiksi jotakin tyyliin /nashome2/nieminen/kj24/demo2.
Seuraavalle riville tulee komennon uname -a tuloste. Tästä tarkastaja näkee, että olet yliopiston suorakäyttökoneella, kuten harjoitteeseen kuuluu.
Seuraavalle riville tulee komennon date tuloste. Tästä näkee, milloin demo on tehty.
Seuraavalle riville tulee komennon ls -l tuloste. Tulosteesta näkyy mm. tässä tehtävässä luotavan skriptitiedoston nimi ja käyttöoikeudet.
Seuraaville riveille tulee komennon ps -u `whoami` -f --forest tuloste. Tulosteesta tarkastaja näkee mm. että käynnissä on screen-ohjelma, jota tässä demossa jumpataan (lisäksi näkyy toki irssi, mutt, nano ym. ohjelmat, joita mahdollisesti käytät samaan aikaan; emacsista saa respectiä välittömästi, samoin vimistä... nanosta vähemmän, mutta jokin editori on oltava käynnissä screenissä). Erityisesti näkyy myös että käynnissä on kuoresta ajettu omatekemä skripti. Epästandardi lisuke --forest helpottaa vastauksen tarkastajaa näkemään, että käytät screen -ohjelmaa näppärästi ja ohjeen mukaisesti.
Kertaus ja täsmennys: Vaikka teksit asioita jollain omalla ja edistyneemmällä huipputavalla, vähintäänkin lavasta tätä vastausta varten ohjeiden mukainen tilanne:
Loppuun tulee vielä listaus itse siitä skriptitiedostosta, jolla edellisetkin rivit tuotettiin. Tähän annetaan alempana valmis ohje, josta ei saa poiketa.
Tulostetiedoston lopussa halutaan vielä tehtävän tarkastamisen yhteydessä nähdä itse skriptin sisältö. Tämä hoituu sillä, että skriptisi viimeinen rivi on TÄSMÄLLEEN seuraava:
cat "$0" >> kj24_demo2_tuloste.txt
Tätä älä muokkaa mitenkään. Myöhemmin kurssilla selviää, millaisia potentiaalisia ongelmia tällä voisi vahingossa saada aikaan. Tämä valmiiksi annettu viimeinen rivi ohjaa kohdetiedoston perään cat -ohjelman tulosteen. Catille on annettu argumentiksi "$0", joka skriptiä ajettaessa korvautuu merkkijonolla, jossa on se komento, jolla skripti itse on käynnistetty. Eli komennoksi muodostuu tässä oikeastaan automaattisesti cat ./demo2_skripti.sh >> kj24_demo2_tuloste.txt. Lopputulemana kirjoittamasi skriptin sisältö siis tulostuu tulostiedoston perään. Dollarimerkillä alkavista jutuista puhutaan myöhemmin lisää. (En tiedä, onko $0:n käyttö tässä standardin mukaista, mutta meidän yhteisessä toimintaympäristössä saadaan nyt tällä tavoin yhteen tarkastettavaan tiedostoon kaikki tarvittava eli tulosteet, joista nähdään, että screen-ohjelmaa ja tekstieditoria on oltu käyttämässä yhtäaikaa sekä myöskin itse se skripti, jolla tuloste on luotu).
HUOM: Tehtävä palautetaan samaan tapaan kuin demossa 1 jo harjoiteltiin.
Tästä demosta palautetaan tasan yksi tiedosto nimeltään kj24_demo2_tuloste.txt, joka on luotu täsmälleen edellisessä kohdassa kuvatulla tavalla.