.. raw:: latex %make block paragraphs: \parindent0pt \parskip10pt .. TODO: Ruudunlukijan käyttöön opastus screenin kanssa. Varmaan tarpeen erillinen ohje. Esim. "nvda screen reader" (kaupallinen vaihtoehto Jaws) Macille on VoiceOver. Linuxille ainakin ORCA. PDF-lukuohjelma Adobe Digital Editions.. TODO: echo -> printf kaikissa paitsi ekan demon ekassa kohdassa? ...Koska echo on POSIXissa "deprecated"-tilassa. Vai sittenkin... demon 2 alussa, ja erillinen aihepiirivideo tästä printf:n käytöstä. Joo.. ilman muuta niin. ... Koska printf ei oo ihan hetsimppeli vehe.. echo helpompi ymmärtää aluksi, ja se nyt varmaan deprekoitunakin elää pari vuosikymmentä vielä.. ############## Sormet unixiin ############## ITKA203 Käyttöjärjestelmät -kurssin Demo 1 keväällä 2015 ja 2016 ja 2017 ja 2018 ja 2019 ja 2020 ja 2021 ja 2022 ja 2023 ja 2024: "Superpikaintro interaktiivisen Unix-shellin käyttöön" Paavo Nieminen, ``paavo.j.nieminen@jyu.fi`` Jyväskylän yliopiston Informaatioteknologian tiedekunta. .. TODO: Pikkasen paha tämä: Täällä puhutaan "skriptistä" vaikkei ole vielä kovinkaan paljon esitelty konseptia.. Pittäis varmaan kuitenkin mennä asia kerrallaan!!! Mietintämyssyyn, mietintämyssyyn.. No mutta joo.. toisaalta näissä ohjeissa myös kerrotaan, mikä se skripti on. .. contents:: Mistä tässä harjoitteessa on kyse ================================= Tämä demo syntyi alunperin Käyttöjärjestelmät -kesäkurssilla 2007. Kiitän silloisia kurssilaisia hyödyllisestä ensipalautteesta. Sisältö on kestävää 1970-luvulta näköpiirissä olevaan tulevaisuuteen. Tämän pitäisi olla Superpikaintro, joten tätä voi mennä aika nopeastikin läpi. Mutta älä kiiruhda! Kaikki asiat ovat tärkeitä ja ne oletetaan tunnetuiksi jatkossa. Näitä perusasioita on **syytä kertailla tulevaisuudessa tällä kurssilla ja myöhemminkin!** **Kannattaa tehdä omia muistiinpanoja** aina, kun opiskelet uutta. Silloin voit palata myöhemmin itsellesi avoimeksi jääneisiin kysymyksiin ja merkityksellisimpiin opittuihin asioihin. Tämä pätee demoihin, luentomonisteeseen, esimerkkikoodeihin ja myös live-luentoihin ja ryhmäkeskusteluihin. Terminologia ja teoria alta pois: *Shell* on englantia ja tarkoittaa suomeksi kuorta. Tässä demossa käytetään nimenomaan käyttöjärjestelmän päälle tehtyä kuorta eli apuohjelmaa, jolla käyttöjärjestelmän tarjoamia palveluita päästään käyttämään. Kuori voi olla graafinen, klikkailtava kuori, tai tekstimuotoinen. Tekstimuotoisesta kuoresta meille on käyttöjärjestelmien peruskurssilla hyötyä ainakin neljästä syystä: 1. Tyypillisiä käyttöjärjestelmän ja laitteiston toimintoja on täsmällistä ja selkeää havainnollistaa tekstimuotoisilla komennoilla. 2. Tekstimuotoisen kuoren komentoja päästään myöhemmin suoraan kirjoittamaan komentoriviohjelmiksi eli **skripteiksi**. 3. Tekstikuorten käyttö on nykyisin harvinaisempaa tietokoneharrastelijoiden ja peruskäyttäjien keskuudessa, joten sitä on jopa aiemaa tarpeellisempaa opetella erikseen tällaisella tulevien ammattilaisten ja tehokäyttäjien kurssilla. 4. Standardoitujen tai vakiintuneiden menettelyjen oppimisesta on kestävää hyötyä pitkälle näköpiirissä olevaan työelämätulevaisuuteen. Yleisesti ottaen kuorityyppinen komenteluohjelmisto voidaan ajatella minkä tahansa kommenneltavan järjestelmän ympärille. Tässä tapauksessa kyseessä on käyttöjärjestelmäohjelmiston kuori. Suora lainasana "shell" on kansainvälisesti tunnettu ja suomen kieleenkin vakiintunut. Oma kielikorvani kuitenkin muuttui 2010-luvun mittaan sellaiseksi, että suomeksi puhun mieluummin kuoresta. Joskus vielä lipsahtaa sekä suuhun että tekstiin kuitenkin "shell". *Shell* tai *kuori* - molemmat on syytä joka tapauksessa tietää ja ymmärtää samaksi asiaksi. Harjoituksen tavoitteet: - Tekstimuotoisen kuoren perusidea tulee sinulle tutuksi ja kuorikomentojen kirjoittaminen alkaa mennä selkärankaan käytännön tekemisen kautta. - Saat hieman ohjattua käytännön kokemusta tekstikuoren käytöstä; vinkit ovat tärkeitä, etenkin jos tämä on ensimmäinen kerta ikinä. - Näet ainakin nimeltä ja päällisin puolin kertaalleen joitain perusohjelmia, joita Unix/Linux -järjestelmiin on useimmiten asennettu; näet myös joitakin "unixmaisia" käytäntöjä esimerkiksi käyttäjän näkökulmasta tiedostojärjestelmään. - Opit, miten aihetta voi itsenäisesti oppia lisää myöhemmin sitten, kun on tarpeen jossakin työ-, harrastus- tai opiskelutehtävissä. - Käyttöjärjestelmäkurssin myöhemmät demot olettavat, että tämän demon pohjataidot jo osataan. Keväällä 2015 määriteltyjen osaamistavoitteiden osalta demon tehtyään opiskelija: - uskaltaa ja osaa käyttää "unix-tyyppistä" käyttöjärjestelmää, esim. Linuxia, komentorivikuoren avulla sekä pääteyhteyden yli, aiheuttamatta vaaraa omille tiedoille tai häiriötä muille käyttäjille tai järjestelmälle [ydin/arvos1] - osaa rakentaa yksittäisiä bash-komentorivejä, hyödyntäen putkitusta ja tiedostoonohjausta [ydin/arvos1] Lisäksi *aloitetaan* tähtääminen myöhemmässä vaiheessa kurssin aikana saavutettavaksi tarkoitettuihin osaamistavoitteisiin. Erityisesti niihin, joissa opiskelija: - tuntee Bourne Again Shell -kuoren (bash) tärkeimmät (erityisesti POSIX-yhteensopivat) sisäänrakennetut komennot sekä yleisimmät unix-tyyppisiin (etenkin POSIX-yhteensopiviin) järjestelmiin asennetut apuohjelmat (grep, find, ...); osaa käyttää näitä manuaalisivujen perusteella sekä arvioida kriittisesti nettifoorumeilta löytyvien ohjeiden laatua [ydin/arvos1] - osaa luetella käyttötarkoituksia, joihin yleisesti käytetään kuorikomentojonoja (shell script, "skripti") [ydin/arvos1] - ymmärtää komentoriviargumenttien ja ympäristömuuttujien roolin sovellusohjelman toimintaympäristön osana; osaa antaa käyttöohjeiden mukaisia argumentteja komentoriviohjelmille sekä julkaista ympäristömuuttujia bash-kuoressa [ydin/arvos2] - pystyy lukemaan ja ymmärtämään yksinkertaisia bash -skriptejä, muokkaamaan niitä hallitusti sekä tuottamaan itse alkeellisia skriptejä mallin tai ohjeiden perusteella [ydin/arvos2] - muistaa apuohjelmia ja keinoja, joilla unix-tyyppisen käyttöjärjestelmän hetkellistä tilaa voidaan tarkastella pääteyhteydellä ja/tai tekstimuotoisella kuorella; kykenee etsimään WWW:stä lisätietoa vastaavien tehtävien suorittamiseen ja arvioimaan kriittisesti ohjeiden laatua ja soveltuvuutta tarpeeseen [edist/arvos3] Näitä viimeksi mainittuja tavoitteita viedään pidemmälle koko kurssin 135 tunnin kokonaiskeston ajan muiden asioiden rinnalla. Erityisesti kaikki demot tehdään kuorella ja tekstimuotoisilla apuohjelmilla. .. raw:: latex \pagebreak .. raw:: latex \pagebreak Merkinnät ja erikoisnäppäimet ============================= - ``Ctrl-R`` tarkoittaa näppäinyhdistelmää, jossa painat Ctrl-näppäimen pohjaan ja sitten kirjainta ``R``. - ``^R`` on usein käytetty muoto ``Ctrl-R``:stä - ``C-r`` on myös mahdollinen kirjoitusmuoto Ctrl-napin ja r-näppäimen yhdistelmälle. - Alunperin kirjoitin näihin demo-ohjeisiin ``R`` kun tarkoitin ihan vain R-näppäimen painamista, josta tulisi oikeasti pieni kirjain ``r``. Joissakin ohjelmissa eroa ei ole, mutta **useimmiten pieni ja iso kirjain ovat eri asioita!** Koetin korjailla ohjetta tältä osin 20.3.2019 ja lisää 7.4.2020, mutta en lupaa että onnistuin 100-prosenttisesti ... - ``Alt-r`` tarkoittaa näppäinyhdistelmää, jossa painat Alt-napin pohjaan ja sitten kirjainta ``r``. - ``M-r`` tarkoittaa Unix-dokumentaatioissa "Meta"-näppäimen käyttöä. Yleensä nykyvehkeissä Alt-näppäimen käyttö on sama asia. Jotkut pääteohjelmat eivät osaa lähettää Altia meta-näppäimenä, mutta usein voi näppäillä ``ESC`` eli Escape ja sen jälkeen kirjain, ja se tarkoittaa samaa. Pääteohjelman asetuksista voi myös löytyä valintoja siihen, miten "metan" lähettäminen pääteyhteyden yli saadaan aikaan. Jotkut komennoissa tarvittavat merkit ovat hieman yllättäviä ja harvemmin käytettyjä muualla kuin kuorissa. Lisäksi ne on joskus vaikea erottaa toisistaan paperilta tai näytöltä. Tässä on mallikappaleet vaikeammin toisistaan erottuvista erikoismerkeistä, joita kuorissa käytetään:: ~ Tilde, "mato"; tavallisesti Alt Gr:n ja sitten sen enterin vierestä löytyvän näppäimen yhdistelmänä. Tämän jälkeen pitää painaa vielä välilyöntiä, että varsinainen matomerkki tulee. Syy on se, että sen varsinainen merkitys on olla espanjalaistyylinen aksenttimerkki, esim. sanassa "mañana" Macissä: sama merkki löytyy näppäilyllä option + ¨ + välilyönti. ^ Sirkumfleksi, "hattu"; tavallisesti Shiftin ja enterin vierestä löytyvän näppäimen yhdistelmänä. Sama juttu: pitää painaa lisäksi välilyöntiä tai voikin tulla esim ê tai î ... " Lainausmerkki, "double quote" ' Heittomerkki, "single quote" ` gravis eli vasemmalle kallistuva aksenttimerkki, "back-tick"; tulee usein Shiftin ja BackSpacen vieressä olevan napin yhdistelmänä. Tämäkin on àksènttimerkkì, joten pitää painaa perään välilyöntiä. (Näin se on ohjelmoijan elämä tehty vaikeaksi suomalaisella näppäimistöllä...) Muista Shift, ettei tule vahingossa ´ eikä ` - ja huomaa, että nämä kaikki eri hipsut ovat täysin eri merkkejä, vaikka näyttävät samankaltaisilta: ´ ` ' | Tolppamerkki; tulee yleensä näppäilemällä Alt Gr + vasemmasta alakulmasta, jossa on suomalaisessa näppiksessä myös > ja < Macissä: option + 7 \ Kenoviiva; yleensä Alt Gr + oikeasta yläkulmasta löytyvä jossa myös ? Macissä: shift + option + 7 [ Hakasulku; Alt Gr + 8 Macissä: option + 8 ] Vastaava sulku toisinpäin; Alt Gr + 9 Macissä: option + 9 { aaltosulku; Alt Gr + 7. Macissä: Shift + option + 8 } Vastaava sulku toisin päin; tulee yleensä näppäilemällä Alt Gr + 0 Macissä: Shift + option + 9 $ dollarimerkki; Alt Gr + 4 Macissä: option + 4 Muita tavallisesti käytettyjä erikoismerkkejä ovat ``()<>*?#!;&$`` jotka erottuvat toisistaan vähän helpommin. Jos sinulla on piilevä lukivaikeus, joka liittyy samankaltaisten merkkien erottamiseen toisistaan, saatat huomata sen esimerkiksi tällä kurssilla. Ei huolta: 5-12 prosentilla väestöstä on sama ominaisuus, ja kaikki pystyvät kyllä tekemään näitä asioita. Tällainen ominaisuus on kuitenkin hyvä tiedostaa, koska silloin täytyy muistaa käyttää enemmän aikaa ja keskittymistä merkkien tulkinnassa. Varoituksia / ennen kuin aloitat ================================ Luennolla nämä samat varoitukset mainittiin/tullaan mainitsemaan, mutta laitetaan ne tähän itseopiskelijoita varten. Komentorivikuorella komennat tietokonetta erityisen suoraan ja tehokkaasti: Jos pyydät poistamaan tiedoston, se HÄVIÄÄ! Ja jos kirjoitat jotain aiemman tiedoston päälle, sen aiempi sisältö HÄVIÄÄ! Ja kun jotain hävisi, se EI TULE TAKAISIN! Mitään tuplavarmistuksia ei ole. Älä pelkää kuitenkaan. Noudata ohjeita, niin kaikki menee hyvin ja on mukavaa. Päivän analogia: Ranskanperunat on tehokasta uppopaistaa rasvassa, joten uppopaisto on hyvä juttu. Vaikka sormien laittaminen kuumaan rasvaan on pieni ja helppo liike, sitä ei saa tehdä sen takia, että se on vaarallista eikä ollenkaan se asia, minkä haluat rasvan avulla toteuttaa. Sama juttu pätee kuoren käytössä. Pääsäännöt; muista aina ----------------------- 1. Ajattele ennen kuin kirjoitat! - aina on oltava täysin varma siitä, mitä komento tekee tai vähintään siitä, mitä keljua se ei varmasti ainakaan tee. - jos et ole varma, mitä komento tekee, lue manuaalia kunnes olet täysin varma. 2. Ajattele vielä kahdesti ennen kuin painat enteriä! - komento suoritetaan vasta sitten kun painat enteriä. Silloin on viimeinen hetki perua; enterin painamisen jälkeen väärän komennon tuhot tapahtuvat silmänräpäyksessä. 3. Älä päästä kissaa, lapsia tai vastaavaa näppäimistölle! - Apinalta menee käytännössä ääretön aika kirjoittaa Sheakespearen tuotanto satunnaisia näppäimiä painelemalla, mutta vahinko voi tapahtua yksinkertaisesti nuolinäppäimen ja enterin painamisella peräkkäin, mikä vaikuttaa jo vaarallisen todennäköiseltä yhdistelmältä. 4. Varo copy-pastaamasta shelliin mitään, koska teksti tulkitaan useina komentoriveinä. Vähintään on oltava absoluuttisen varma siitä, mitä leikepöydällä on ennen kuin lähtee liimaamaan sitä komennoiksi! (Rivinvaihdot tulkitaan entereiksi, eli joka rivistä tulee eri komento!) 5. Tee silloin tällöin varmuuskopiot korvaamattoman tärkeistä tiedostoista. (Vaikka et itse hukkaisi edes vahingossa mitään, laitevika saattaa periaatteessa tuhota tiedostosi milloin vain). Yliopiston kotihakemistostasi on (kai, ehkä) periaatteessa olemassa melko uusi automaattinen varmuuskopio, mutta tekniikkaan, kuten tähänkään, ei yleensä kannata luottaa 100-prosenttisesti. Vähintään voit olla varma, että *mikrotuki ei tule olemaan iloinen siinä vaiheessa, kun varmuuskopioita täytyy lähteä kaivelemaan arkistonauhoilta*. Nykyään on tosi näppäriä pilvipalveluita varmuuskopiointia varten. Palveluiden ilmainenkin tila riittää oikein hyvin monien elintärkeiden tietojen tallentamiseen. Tässä kategoriassa on esimerkiksi hääkuvat ja muut rakkaat muistot. Lähdekoodi, opinnäytteet ja muut pääosin tekstimuotoiset työt on hyvä pitää versionhallinnassa niin, että silloin tällöin työntää muutoshistorian ulkoiseen pilvipalveluun. Tällä kurssilla ei ehditä opettaa versionhallintaa; sitä on ainakin tietotekniikan ohjelmointi- ja projektikursseilla ja asian voi myös opetella omatoimisesti. Mahdollisimman pian. Pelottavia esimerkkejä ---------------------- - jos vahingossa antaisit komennon ``rm -rf *`` kotihakemistossasi, kaikki tiedostosi hukkuisivat iäksi. En suosittele. - esimerkiksi, jos vahingossa antaisit komennon ``echo > gradu.docx``, tiedoston ``gradu.docx`` sisältö tuhoutuisi täysin. Ei kannata. - jompikumpi edellisistä (tai joku muu pommi) saattaa lymytä leikepöydällä melkeinpä odottamassa, että vahingossa liität sen kuori-ikkunaasi. - jompikumpi edellisistä (tai joku muu pommi) on saattanut juuri äsken olla tarkoituksellinen komento, ja se melkeinpä odottaa, että otat sen nuolinäppäimillä vahingossa komentohistoriasta. Tai kissasi ottaa. - Tuplavarmistuksia ei ole, vaan kuori olettaa, että tiedät, mitä haluat. Siis vielä kerran: ole varma komennoistasi! Kirjoittaja vastaa siitä, että tämän oppaan esimerkit ovat täysin turvalliset **jos ne kirjoitetaan merkistä merkkiin sillä tavoin kuin ne tässä annetaan**. Siihen vastaaminen loppuu. Älä siis sohlaa ellet ymmärrä. Sitten kun olet varma siitä mitä sohlaat, se muuttuu jopa suotavaksi. Aluksi nämä varoitukset on ymmärrettävistä syistä annettava. Niistä huolimatta tämän harjoituksen päätarkoitus on **vähentää pelkokerrointa** ja tehdä yksi **tehokkaan automaattisen tietojenkäsittelyn työkalu tutuksi ja turvalliseksi**. Mitään hätää ei ole, jos noudatat yllämainittuja pääsääntöjä, etenkin numeroa yksi, *"ajattele ennen kuin kirjoitat"*, ja viisi, *"pidä varmuuskopiot"*. Toivon lukijalle tietoteknisen vapautumisen, ymmärtämyksen luoman turvallisuuden sekä tehokkuudesta syntyvän riemun kokemuksia, jollaisia interaktiivisen kuoren oppiminen itselleni aikoinaan tarjosi! Apua "paniikkitilanteissa" -------------------------- " Apua! Painelen näppäimiä, mutta mitään ei tapahdu shellissä " Jotkut normaalit tilanteet voivat näyttää siltä, että pääteyhteys tai kuori jumittui eikä tee mitään. Alla on pieni ongelmanselvitysohje pääteyhteydelle silloin, kun se "lakkaa vastaamasta". Tärkeintä on olla menemättä paniikkiin; näppäimiä ja varsinkaan enteriä ei saa hakata hullun raivolla, koska voi tulla tuhoja (ks. varoitukset edellä). Todennäköisesti kyseessä on ihan normaali ilmiö. + Yleisiä syitä: - Graafisen työpöydän fokus muualla kuin konsoli-ikkunassa (eli pääteyhteysikkunassa)? Klikkaa konsoli-ikkunaa, ja katso auttaako. (Klikkaa vasemmalla hiirennapilla, koska muut napit saattavat vahingossa pastettaa jotakin päätteelle [ei kannata...]!) - ``Ctrl-s`` painettu vahingossa? Paina ``Ctrl-q``. Jostain syystä (veikkaan että historiallisena jäänteenä) on käytössä näppäinkomento ``Ctrl-s``, joka pysäyttää sinulle päin tulevan tulostuksen. Kaikki näppäinpainalluksesi kuitenkin välittyvät edelleen palvelimelle! Tulosteet jäävät jemmaan ja ne tuodaan puskurista kerralla sinulle sitten kun painat ``Ctrl-q``. Outo homma, mutta näin se toimii vielä tänäkin päivänä... - Ohjelma jumissa / ajo kestää liian kauan? Kokeile ``Ctrl-c`` (stop) tai ``Ctrl-z`` (suspend) ja tarkista tila. Keinoja ohjelmien tilan hyvinkin tarkkaan tarkisteluun käydään läpi kurssin mittaan. - Väliaikaiset ongelmat palvelimella: Esimerkiksi keväällä 2014 yliopiston suorakäyttökoneissa oli ulkopuolisista syistä johtuva ongelma, jonka vuoksi pääteyhteys tuntui "odotuttavan" satunnaisesti sisäänkirjautumisessa ja joskus myös yhteyden aikana. Viiveen kesto oli joistain sekunneista joihinkin minuutteihin. Ei ole tiettävästi ilmennyt uudelleen lähivuosina (tilanne 2019). Järjestelmissä voi kuitenkin tulla aina uusia ihmeellisiä ilmiöitä, joita sitten ihmetellään! - Oman talon verkkoyhteys poikki? Ei voi kuin odotella. (Tai voi kiljua palveluntarjoajan tukipalvelunumeroon ja lisäksi odotella.) + Harvinaisempia: - Etäkone kaatui / käynnistettiin uudelleen muistamatta ilmoittaa käyttäjille? Todennäköisesti varmistus ajaa koneen kohta ylös. Odottele. Toivottavasti automaattinen tallennus toimi, eikä tiedostojärjestelmä vioittunut sinun kotihakemistosi kohdalla. - Omassa koneessa / asennuksessa vikaa? Olet oman onnesi nojassa... onnea ylläpitotaidon opiskeluun tai kilauta nörttikaverille, joka on palveluksen velkaa... Apua saattaa löytyä myös kurssia varten perustetulta vertaistukikanavalta, jos opiskelet samaa tahtia muiden kanssa. - Etäkoneessa viallinen asennus / buginen käyttöjärjestelmä tai kuori? Yritä rinnakkaista yhteyttä koneeseen ja tarkista jumittuneen kuoren tila prosessinhallintakomennoilla. (Näitä komentoja kertyy kurssin mittaan jonkinlainen joukko, pohjateorian ohella) " Apua! Komentoni menevät läpi ja tulosteet tulevat, mutta en näe, mitä kirjoitan. " + Itselleni on käynyt joskus näin; en yhtään tiedä, mistä se johtuu enkä osaa korjata. Yritä kirjoittaa sokkona komento ``exit`` ja ottaa yhteys uudelleen. Ja jos itse tiedät, miksi merkkien kaiutus voisi mennä rikki, kerro se heti mullekin! (Ei ole tapahtunut itselleni jotakuinkin vuoden 2011 jälkeen, joten todennäköisesti on ollut kyse sittemmin korjatusta ohjelmistovirheestä joko Windowsille tehdyssä pääteyhteysohjelmassa tai palvelimen pääteohjelmistossa... toivotaan, ettei ongelma tule takasin.) " Täysi paniikki! Kaikki on jumissa! " + Niin, siihen paniikkiin yritä olla menemättä... + Jotkut ohjelmat voi olla pirullisia käyttää ennen kuin on lukenut niiden ohjeet. (Samoihin ohjelmiin saattaa ohjeiden lukemisen jälkeen lähes rakastua, koska ne ovat nii-in tehokkaita käyttää). Yksi esimerkki on Vi-tekstieditori, jossa pitää osata painella järjestyksessä näppäimet ``ESC`` ``:`` ``q`` ``!`` ja enter, että pääsee pois. Emacs-tekstieditorin poistumiskomento puolestaan on kahden peräkkäin painetun näppäimen yhdistelmä ``Ctrl-x`` ``Ctrl-c``. Muitakin ehkä voi tulla vastaan. (Kohteliaisuussyistä mainitsin ensimmäisenä vi:n, vaikka olen itse emacs-fani.) + Joskus ohjelmat kysyvät jotakin, johon pitäisi osata vastata jotakin. Jos et ole kiinnostunut opettelemaan asiaa manuaalista, tai ei ole aikaa, kokeile seuraavia näppäilyjä, jotka useissa ohjelmissa peruuttavat aloitetun interaktiivisen toiminnon: - ``ESC`` - ``ESC`` pari kertaa peräkkäin - ``Ctrl-g`` -- tämä on aika tyypillinen "Cancel"-toiminnon näppäin - ``Ctrl-q`` tai ``Ctrl-c`` -- huomaa että nämä saattavat lopettaa koko ohjelman! + Viimeisenä keinona sulje vaan kylmästi pääteyhteysohjelma ja ota yhteys uudelleen. Normaalisti tähän pitäisi olla hyvin vähän tarvetta. Lieveilmiönä sessiot ja ohjelmat saattavat tällöin jäädä palvelimen puolella päälle ja lisätä muiden käyttäjien kokemaa kuormitusta. Kohteliasta on muutenkin tarkistaa välillä omien ohjelmien tilanne ja lopettaa tarpeettomat ohjelmat; tällä kurssilla opitaan peruskeinot omien palvelinresurssien käytön tarkkailuun ja kyky etsiä lisää ohjeita netin tutoriaaleista. Kurssin ensimmäisten päivien aikana voidaan hieman hihitellen hyväksyä, että aloittelijoilla on jäänyt juttuja jumiin suorakäyttökonetta kuormittamaan. Opetellaan tästä kuitenkin eroon mahdollisimman pian! Tarkennuksia: Unix/Linux/GNU/BSD/... ==================================== Jos haluat vain päästä käsiksi harjoitteisiin, voit hypätä tämän luvun yli. Tässä vähän halkaistaan hiuksia ja ylitarkennetaan, mitä olen osannut kertoa, ja mitä kenties en. Tämän kurssin käytännön harjoitteet toteutetaan Jyväskylän yliopiston Digipalveluiden kaikille opiskelijoille tarjoamalla suorakäyttökoneella nimeltä ``jalava.cc.jyu.fi`` tai vastaavalla koneella ``halava.cc.jyu.fi``. Tätä kirjoittaessa (maaliskuu 2024) noissa koneissa on käyttöjärjestelmäksi asennettu Red Hat Enterprise Linux Server release 7.9 (Maipo), joka on niin sanottu Linux-jakelupaketti eli "jakelu" tai "distribuutio" tai "distro". Päivityksiä tulee silloin tällöin, joten tätä lukiessasi versio voi olla jo uudempi. Jakelupaketti sisältää Linux-käyttöjärjestelmän ytimen sekä valikoiman apu- ja sovellusohjelmia. Suurin osa apuohjelmista on erillisen GNU-projektin (lyhenne "GNU" tarkoittaa "GNU's Not Unix") tuottamia, ja alkuperäisohjelmiston tekijöiden mielestä tällaisesta kokonaisjärjestelmästä tulisikin käyttää nimeä GNU/Linux eikä pelkkä Linux, koska ytimen ympärille tehdyt apuohjelmat ovat merkitsevässä roolissa järjestelmän käytön kannalta, eivätkä ne ole toiminnoiltaan sidoksissa Linux-ytimeen. Tällä kurssilla kuitenkin on kiinnostuksen kohteena varsinkin käyttöjärjestelmän ydin, joka esimerkkinä käytettävissä järjestelmissämme on Linux. Se on suomalaisen Linus Torvaldsin 1990-luvulla alullepanema käyttöjärjestelmäydin, joka pohjautuu 1970-luvulta saakka vahvasti vaikuttaneeseen Unix-käyttöjärjestelmään. Molempien käyttöjärjestelmien, Unixin ja Linuxin, erilaiset versiot ja muunnokset sekä niiden jakelupaketit (sekä kaupalliset, kuten kyseinen Red Hat Enterprise Linux, että ilmaiset, kuten Fedora, Ubuntu, Arch, Kali, ...) elävät ja voivat hyvin toistaiseksi ja näköpiirissä olevassa tulevaisuudessa. (Edellinen lause kirjoitettu vuonna 2015 ja todettu olevan yhä voimassa 2016 ja 2017 ja 2018 ja 2019 ja 2020 ja 2021 ja 2022 ja 2023 ja 2024). Esimerkiksi valtaosa nykypäivän WWW-palvelinkoneista käyttää jotakin Unixia tai Linuxia käyttöjärjestelmänä. Sama tilanne on supertietokoneissa eli tieteellisissä "numeronmurskaimissa". Linux on potentiaalinen käyttöjärjestelmä myös kännyköihin ja muihin sulautettuihin järjestelmiin, joissa jonkin työkalun tai laitteen toimintaa ohjataan sisäänrakennetulla, mahdollisesti ulospäin näkymättömällä tietokoneella. Tällä hetkellä suosituin älypuhelinten ohjelmistoalusta vaikuttaisi olevan Android ( tarkistettu muutamasta Googlella löytyneestä eri statistiikasta viimeksi 21.3.2024 ), joka sekin on rakennettu Linuxin ytimen päälle. Linux-osaamista arvostetaan työmarkkinoilla. Kurssin luennoilla sivutaan jonkin verran käyttöjärjestelmien historiaa ja aivan muutamaa merkkipaaluksi jäänyttä toteutusta, mutta niiden tarkempi sukupuu jää oman kiinnostuksen ja tiedonhaun nojaan. Viidessä opintopisteessä on keskityttävä toisaalta hyödyllisiin nykypäivän kädentaitoihin ja toisaalta nykyaikaisen käyttöjärjestelmän toteutuksellisiin yksityiskohtiin, vaikka myös historian tarkempi tunteminen olisi akateemisesti hyödyllistä. Käytän joskus sanamuotoa "Unixissa tai ainakin Linuxissa", koska jotkut asiat toimivat hieman eri tavoin Linuxissa kuin muissa/aiemmissa Unixeissa, ja itselläni oli varsinaista kokemusta lähinnä Linuxista, kun alunperin kirjoitin tämän demo-ohjeen. Eroja on sitä enemmän, mitä monimutkaisemmasta työkalusta on kyse. Perusperustyökalut, joita tässä oppaassa nähdään, ovat melko yleismaailmallisia. Kuitenkin jossain kulkee raja siinä, mikä on Perusperustyökalu, mikä on vain Perustyökalu, ja mikä ei sitten enää ole "peruskalu" ollenkaan vaan enemmänkin itsenäinen ja erillisenä toimitettava sovellus, joka ei ole yleinen osa kaikkia jakeluita. Rajat vaikuttavat joskus häilyviltä, jolloin on parasta tarkastella standardeja ja niiden noudattamista. Tällä kurssilla silmäillään ainakin POSIX-standardia, jossa sovitaan tiettyjä sääntöjä, joita kaikkien yhteensopivien järjestelmien tulisi noudattaa. Sekä standardointi että toteutuksien tekeminen standardien mukaiseksi on vaivalloinen prosessi. Täyden yhteensopivuuden saavuttaminen lähes 4000-sivuiselle rajapintadokumentaatiolle on iso homma, eivätkä kaikki järjestelmät siihen täysin pysty, eikä aina ole tarpeenkaan. Aika saattaa ajaa ohi standardeista, ja järjestelmien tekijöiden on tarpeen tuottaa omia laajennoksiaan, kunnes uusien tarpeiden mukaiset ominaisuudet saadaan standardoitua. Esimerkkinä tällaisesta ilmiöstä on Linuxin omat standardit, joissa toteutetaan osia POSIXista, mutta myös muita ominaisuuksia. GNU/Linux -jakeluiden mukana jaettavissa GNU-projektin työkaluissa on myös paljon laajennoksia POSIXin edellyttämiin piirteisiin nähden. POSIXin selailu antaa kuitenkin hyvän yleiskuvan "pienimmästä yhteisestä nimittäjästä", jonka mukaisissa puitteissa toimimalla on parhaat mahdollisuudet toimittaa alustariippumattomia sovelluksia. Järkevässä järjestelmän kehityksessä vähintään pyritään mukailemaan standardeja, koska silloin potentiaaliseen käyttäjäkuntaan saadaan henkilöt ja sovellukset, jotka jo valmiiksi noudattavat kyseisiä standardeja. Mitä tämä esipuhemainen höperrys tarkoitti? Sitä, että - Tässä oppaassa mainitut työkalut ovat ihan varmasti saatavilla, ja toimivat juuri tässä kerrotulla tavalla, jos käyttöjärjestelmänä jossakin on Linuxin Fedora -distribuutio, jota itse käytän, tai Red Hat Enterprise Linux Server release 6.7, jolla toimivaksi tämä demo on aikoinaan testattu. - Monet niistä ovat melko varmasti saatavilla (tai ainakin pienellä vaivalla asennettavissa), jos käytät mitä tahansa muuta Unix-varianttia, joita on siis maailmalla paljon. Ajattele tässä olevia esimerkkejä juuri vain esimerkkeinä, ja muista, että opettelet olennaisempaa asiaa kuin joku tietty komento tai sen argumenttien muoto: Opettelet *interaktiivisen kuoren käyttöä, sen ideaa ja mahdollisuuksia, ja monen käyttäjän järjestelmässä toimimista pääteyhteyden kautta*. Se on aina samanlaista vaikka komennot tai syntaksit olisivat mitä! Osa 1: Ota pääteyhteys yliopiston IT-palveluiden koneelle ========================================================== Tässä pikaintrossa oletetaan seuraavat asiat: - Toimit joko Agoran mikroluokassa tai muualla, missä käytössäsi on esimerkiksi Windows -käyttöjärjestelmä sekä SSH-kelpoinen yhteysohjelma. Vuonna 2020 tehtiin Windows-käyttäjille ohjevideo siitä, miten Powershelliin saa asennettua samanlaisen ssh-ohjelmiston. Windows 10:n perusohjelmistoon se taitaa kuulua jopa ilman lisäasennusta. Asia kannattaa varmistaa. Windowsille on saatavilla myös erillisiä ssh-asiakasohjelmia kuten KiTTY Client tai PuTTY SSH Client, jotka saa netistä ilmaiseksi. Linuxissa ja Maceissä on valmiina yhteysohjelma, joka käynnistyy omalta komentoriviltä komennolla ``ssh yotunnuksesi@halava.cc.jyu.fi``. Joitain merkkien välittymiseen ja kuvaruudun päivittymiseen liittyviä ongelmia havaittiin Windowsilta tehtäessä keväällä 2020. Yksi kiertotie näihin oli vaan asentaa PuTTY ja käyttää sitä. Sitten kuitenkin löysimme myös toisen keinon, joka on unohtunut. Jos ongelma ei ole korjautunut Windowsin ohjelmistopäivitysten myötä, niin etsitään korjaus yhdessä uudelleen vertaistukikanavalla keskustellen, kuten viimeksikin... sen voi sitten päivittää tähän kohtaan ohjetta, kun löytyy. Toiminnan etäyhteydellä pitäisi näyttää samalta kuin luentovideoilla. Jos niin ei ole, pitää asia selvittää ja korjata. Vertaistukikanavalle siis kysymään, jos jokin ei näytä oletuksen mukaiselta. - HUOMIO: Etäkoneemme käyttävät merkistön koodaukseen oletuksena Unicoden "UTF-8" -muotoa, joka on syytä laittaa päälle omista asetuksista! Muuten tulee isoja ongelmia suomenkielisten ääkkösten ja monien muidenkin merkkien kanssa! - Olet Jyväskylän yliopiston opiskelija, jolloin sinulla on käyttöoikeus IT-palveluiden suorakäyttökoneille. Käyttäjätunnus ja salasana on sinulle joskus jaettu. Jos näin ei kohdallasi ole, ota yhteyttä, niin mietitään ratkaisua... - Huom: Unix-koneiden käyttö täytyy aktivoida erikseen; ohjeet ovat tuossa alla. Aktivoinnissa on tekninen prosessointiviive (kuulemma noin 30-60 minuuttia), jonka aikaa on odotettava ennen kuin demoja voi alkaa tekemään. Seuraavassa käytetään yhteysohjelmana KiTTYä (toiminee PuTTYssä samalla tavoin). Varo tosiaan copy-pastea; hiiriklikkaukset näyttävät toimivan KiTTY-ohjelmassa "Linux/X-mäisesti" mikä voi Windows-käyttäjää ihmetyttää: Jo pelkkä maalaaminen ikkunassa tekee välittömästi kopion leikepöydälle, ja oikeanpuoleinen nappi liittää leikkeen sisällön ikään kuin se kirjoitettaisiin tekstinä näppäimistöltä! Jos tämä on ensimmäinen kerta ikinä ----------------------------------- Digipalveluiden ohjeen mukaisesti sinun pitäisi ensin käydä aktivoimassa Unix-tunnus WWW-osoitteessa https://sso.jyu.fi/ jos et ole sitä aiemmin tehnyt: + Linkki "Oma - omien tietojen hallinta" + Sieltä linkki "Palvelut" + Ruksi ruutuun "Unix-suorakäyttöpalvelimien kirjautumisoikeus" + Sitten "Tallenna". .. Varmista, että interaktiiviseksi shelliksi on valittu ``bash`` eli jos kohdassa "Account Info" ei ole "Shell" -rivillä "bash", niin käy vaihtamassa: + Klikkaa "Change Account Info", vaihda kohtaan "Shell" valinta "bash". .. Tämä ``bash`` eli Bourne Again Shell on nykyinen oletusasetus, mutta joillakin vanhemmilla opiskelijoilla se on mahdollisesti ollut jotakin muuta. Nykyään kannattaa käyttää bashiä, mm. koska suurin osa netistä löytyvistä Unix-ohjeista on juuri bashin käyttöä ajatellen tehty. Bash toteuttaa POSIX-standardin kuoriosuuden, mutta sisältää laajennoksia, joiden käyttö voi olla perusteltua, mikäli jokin asia hoituu niillä paljon helpommin kuin POSIX-osajoukolla. (Tämän kurssin demot on aikoinaan tehty suoraan bashillä, eivätkä ne välttämättä rajoitu POSIX-ominaisuuksiin; yhteensopivuus on jatkuvalla TODO-listalla; tehtävässä saa auttaa...) Sitten pitäisi olla Unix-etäyhteys käytettävissä. Saattaa myös olla jonkinlainen prosessointiviive ennen kuin palvelu aktivoituu. Näillä ohjeilla on havaintojen perusteella onnistuttu hyvin vuosina 2019 ja 2020. Aina voi tulla uusia ihmeellisiä ilmiöitä, joista kannattaa tarkkailla tilannetta ja vaihtaa kokemuksia vaikkapa kurssin vertaistukikanavilla. .. Systeemit ovat taas muuttuneet aivan äskettäin (tilanne v. 2019), joten meidän täytyy nyt tarkkailla tilannetta ja vaihtaa kokemuksia vaikkapa kurssin keskustelusähköpostilistalla. (Vuonna 2020 ei ilmennyt tällaisia ongelmia - demon alkuun näytti pääsevän ihan tuon ohjeen mukaan) Seuraavaksi: - Etsi ja käynnistä KiTTY SSH Client -ohjelma (tai muu valitsemasi SSH-asiakasohjelma) - Kirjoita etäkoneen osoitteeksi ``jalava.cc.jyu.fi`` tai ``halava.cc.jyu.fi`` ja klikkaa "Open" - Ensimmäisellä kerralla tulee dialogi-ikkuna, jossa kysytään, hyväksytkö etäkoneen Host Key:n. Se ei (ehkä, välttämättä, toivottavasti) tällä kertaa tarkoita, että joku vakoilisi tietoliikennettä, vaan sitä, että Jalavan isäntäavainta ei ole vielä tallennettu paikalliselle tietokoneelle. Voinet klikata hyväksyvästi. Jos joku ilkeä yrittää napata tietoliikennettä, tämä varokeino kertoo tarkkasilmäiselle käyttäjälle siitä. Normaalisti tämä tulee vain ensimmäisellä yhteyskerralla tai silloin, kun isäntäkoneella on esim. niin suuri päivitys että avain vaihdetaan. - Kirjoita käyttäjätunnus, kun kysytään ``login as:`` - Kirjoita yliopiston salasanasi, kun sitä kysytään, eli tulostuu ``password:`` (huomaa, että salasanan merkkejä ei kaiuteta näkyviin päätteellesi, tietenkään) .. - Jossain vaiheessa voit tutustua kirjautumisen yhteydessä mainittuun infosivuun + http://www.jyu.fi/thk/ohjeet/how-to-nain-tehdaan/suorakaytto-unix ... Tämä demo-ohje tosin kertoo enemmän kuin tuo sivu ainakaan vuonna 2014 kertoi (tai 2015 tai 2016 tai 2017 tai 2018...). Ja vuonna 2019 kyseinen sivu ei kertonut mitään.. Osa 2: Tutustu etäympäristöösi ============================== Nyt tutustut kuoren käyttöön kirjoittamalla komentoja, jotka tulostavat tietoja siitä tietokoneesta, johon olet yhteydessä. Jokaisen komentorivin jälkeen pitää tietysti painaa enter. Komennot ovat lyhyitä aluksi. Loppua kohti tehdään pidempiä ja pidempiä. Mutta lähdetään liikkeelle perusasioista. HUOM: Syntaksi on hyvin tarkka aina välilyöntejä myöten! Eli tarkkana esimerkkien välilyönneissä ja erikoismerkeissä. Isot ja pienet kirjaimet ovat myös merkityksellisiä, esim. ``S`` on eri merkki kuin ``s``. Kuka olet, missä olet --------------------- **Kuka olet?** Komenna:: whoami Mitä tapahtui? Kuori kertoi, kuka sinä sen mielestä olet. Eli käyttäjätunnuksesi tulostui. **Missä olet?** Komenna:: uname -n **Millainen paikka se on?** Komenna:: uname -nmo Tämä kertoo millainen prosessori ja minkä tyyppinen unix etäkoneessa on. Vielä lisää tietoa:: uname -a Keitä muita on paikalla? ------------------------ Komenna:: who Koeta tulkita tulostetta. Havainnet, että ``who`` kertoo, mitkä muut käyttäjätunnukset ovat tällä hetkellä kirjautuneina koneelle. Se kertoo myös, milloin kukin käyttäjä on kirjautunut ja minkä nimiseltä tietokoneelta yhteys on otettu. Jokainen koneeseen otettu yhteys näkyy yhtenä rivinä. Huomaa käyttäjän näkökulma moniajoon: Eikö vaikutakin siltä kuin itse olisit ainoa joka käyttää tietokonetta, vaikka Jalavan prosessoreita käyttää kovin moni muukin yhtäaikaa! Tämä kokemuksesi on yksi nykyaikaisen käyttöjärjestelmän tavoitetilanne. (Ja pääteyhteydessä voi kyllä joskus havaita tiettyä "tökkimistäkin", joka saattaa johtua esimerkiksi etäkoneen suuresta käyttöasteesta. Teoria ja käytäntö tähän liittyen tulevat tutuiksi tällä kurssilla.) Kaikki nimet tuskin mahtuivat yhteen kuvaruudulliseen. Kokeile pääteohjelmasi vieritys-ominaisuutta. Jossain kohtaa ikkunaa on luultavasti vierityspalkki, josta näet ohi vilahtaneet rivit. Voi myös olla, että esim. näppäinyhdistelmä ``Shift+Page Up`` antaa edellisen sivun tulosteesta ja ``Shift+Page Down`` seuraavan. Tulosteita tallentavan puskurin koko on rajoitettu, joten ihan vanhimmat rivit häviävät sitä mukaa kun uusia tulee. Puskurin kokoa voi luultavasti säätää oman yhteysohjelmasi asetuksista. Komenna:: who | less Nyt jouduitkin uuteen tilanteeseen! Ensinnäkin käynnistit kaksi ohjelmaa yhden sijasta. Minkä tahansa ohjelman tulosteen voi ohjata minkä tahansa toisen ohjelman syötteeksi käyttämällä tolppamerkkiä ``|`` yllä olevalla tavalla. Tätä sanotaan putkittamiseksi. Ohjelmien välille muodostuu **putki** (engl. *pipeline* t. *pipe*), jota pitkin data kulkee ohjelmalta toiselle. Asiaan palataan myöhemmässä osiossa. Lisäksi viimeksi käynnistämäsi ohjelma ``less`` on itsessään interaktiivinen. Sen tarkoitus on näyttää pitkä teksti pieni pätkä kerrallaan. Tällaista ohjelmaa sanotaan sivuttajaksi (engl. *pager*). Lessillä tulostetta voi selata nuolinäppäimillä ylös ja alas. **HUOM:** Less-ohjelmasta pääsee pois näppäilemällä ``q``. Kun olet tyytyväinen, näppäile siis ``q`` lopettaaksesi less-ohjelma. Sen jälkeen olet taas aiemmassa tilanteessa, jossa kuori odottaa seuraavaa komentoa. Pääteyhteydellä ei siis tarvitse käyttää pelkästään kuorta tai yksinkertaisia apuohjelmia. Mitä tahansa tekstimuotoisia ohjelmia (tai siis niin sanottuja konsoliohjelmia) voidaan käynnistää ja käytellä pääteikkunassa. Ja jos etäkoneella ja omalla koneella on yhteinen ikkunointijärjestelmä, voi nopean nettiyhteyden yli kuljettaa grafiikkaakin. (POSIX-huomautus: ``less`` tarjoaa enemmän ominaisuuksia kuin POSIXin edellyttämä sivuttaja ``more``, mm. selaamisen edestakaisin, joten käytetään tällä kurssilla mukavuussyistä lessiä eikä morea. Tarvittaessa voi asettaa ympäristömuuttujan nimeltä ``LESS_IS_MORE`` sisällöksi ``1``, jolloin less muuttuu POSIX-yhteensopivaksi ja käyttäytyy kuten more. Ympäristömuuttujista puhutaan kurssilla lisää myöhemmin.) .. Päivityksessä 2024 suorakäyttöneilta on poistunut finger -asennus, mutta me ei ehkä sitä kaipailla takaisin. On ollut vähän tarpeettoman helppo listata tuhansia käyttäjätunnuksia ja nimiä jopa vahingossa ... Jätän osion kommentteihin, mutta eiköhän tämän voi ihan deletoidakin. **Kuka on kukin?** Komenna:: finger Tarkkaile, miten tuloste on erilainen kuin edellä ``who`` -komennon tulostama. Jos haluat, voit käyttää sivuttajaohjelmaa ``less`` jälleen putken avulla (ja less -ohjelmasta tosiaan pääsee pois näppäilemällä ``q``):: finger | less Valitse joku kirjautuneista käyttäjätunnuksista tai joku tuntemasi kaveri/opettaja, ja katso, mitä saat tietää hänestä palvelimelta. Esim. komenna:: finger -m nieminen Huomaa, että tässä tarkoitetaan käyttäjätunnusta eikä oikeata nimeä. (Aikoinaan voitiin ottaa käyttäjätunnukseksi vaikkapa oma sukunimi, jos kyseinen tunnus sattui olemaan vapaana, mutta nykyään tämä ei ole enää käytäntönä). Käytä fingeriä joka tapauksessa ainakin käyttäjätunnukseen ``nieminen``. Huomaat, että siellä näkyy käyttäjän itsensä asettamia tiedotuksia. Jokainen voi asettaa näitä itselleen tietyllä tapaa, mutta ei käsitellä asiaa tässä tarkemmin. (Jos jossain vaiheessa asetat itsellesi ``.plan`` -tiedoston, pidä tarkoin huolta hakemistojesi käyttöoikeuksista, ja ymmärrä niiden vaikutus. Tällä kurssilla opitaan tästä perusteet viimeistään luennolla, joka käsittelee tiedostojärjestelmiä.) **Mitä kukin tekee?** Komenna:: ps -ef Mitä tapahtui? Komento tulosti kaikkien käyttäjien kaikki käynnissä olevat ohjelmat. Niitäkin on luultavasti aika monta koko ajan. Älä vielä tässä vaiheessa huoli siitä, mitä kaikki tulosteen tiedot ovat. Ne selviävät varmasti Käyttöjärjestelmät -kurssin edetessä yksi asia kerrallaan. Ensimmäinen sarake on käyttäjätunnus ja viimeinen on se komento, jolla käyttäjä käynnisti ohjelman. Huomannet, että ``root`` -niminen käyttäjä on käynnistänyt paljon ``sshd``-ohjelmia. Itse asiassa tämä on sitä, kun käyttöjärjestelmän valtuuksin (root) toimiva SSH-palvelin on käynnistänyt login-kuoria etäyhteyksille. Sinullekin pitäisi tällä hetkellä löytyä tuollaiset rivit ``ps``:n tulosteesta. Tuloste oli varmasti pitkä. Kertaava harjoite: Putkita tuloste less-ohjelmalle ja selaile sitä edestakaisin; lopeta less, kun siltä tuntuu. Tietoturvaan liittyvä huomautus: Annetut komennot ovat julkisia muille käyttäjille, kuten huomaat. Niihin ei siis kannata kirjoitella järin suuria salaisuuksia! Mitä omistat täällä? -------------------- (Tai siis millainen paikka sinulla on täällä lainassa yliopistolta opintojesi ajan). Komenna:: pwd Jos mitään ihmeellistä ei ole tapahtunut, olet yhä kotihakemistossasi, johon sisäänkirjoittautumisen jälkeen kuoressa päästään. Komento ``pwd`` kertoo nykyisen oleskeluhakemiston. Se on jotain vastaavaa kuin ``/nashome3/nieminen``. .. (tai ehkä jossain on joku asetus, jolla voi määrätä shellin aloituksen eri paikkaan kuin kotihakemisto; en tiedä, koska en ole koskaan tarvinnut sellaista ominaisuutta) .. tämä lienee jotakin, mikä selviää kyllä speksistä tasan tarkkaan.. ei oo ehtinyt selvittää... okei, mutta kyllä on ihan hyvä idea jokaiselle, että tarkistaa shellin aloitushakemistoksi $HOMEn jne. Parempi niin. Vähempi ongelmaa niin. OK. Huomaa, että Unixissa hakemistonimissä on hakemistojen erottimena kauttaviiva ``/`` kun taas Windowsissa kenoviiva ``\`` palvelee vastaavaa tarkoitusta. Unixin tiedostojärjestelmän "juuri" on hakemisto ``/`` eli pelkkä kauttaviiva. Koko hakemistorakenne jäsentyy siitä alkaen. (Tällainen rakenne voi olla joltain kantilta katsoen suoraviivaisempi ja loogisempi kuin esimerkiksi eri juuren antaminen eri "levyasemille" eli ``A:``, ``B:``, ``C:`` jne.) Komenna:: ls Pitäisi tulostua kotihakemistosi sisältö. Huomaa, että se on sama kuin ``U:`` -asemasi yliopiston Windows-koneilla. Kumpikin hakemistopolku viittaa samaan paikkaan jaetulla verkkolevyllä (engl. *network attached storage, NAS*). Fyysinen kovalevy voidaan siis jakaa ihan eri käyttöjärjestelmien ja tietokoneiden välillä! Voit hyvin olla kirjautuneena useaan tietokoneeseen, joissa kaikissa näet yhden ja saman verkkolevyn sisällön ikään kuin se olisi yksi paikallisen koneen levy (tai itse asiassa hakemisto). Verkkoyhteyden pätkiessä verkkolevyn tietoja ei tietenkään voi lukea eikä kirjoittaa. Mitä täällä voi tehdä --------------------- Ensinnäkin voit huutaa ja katsoa, miten kaiku vastaa (mutta "huuda" toistaiseksi esimerkin mukaisesti ilman huutomerkkiä, koska huutomerkillä ``!`` on erikoismerkitys kuoressa). Komenna:: echo Miten kaiku vastaa Komento ``echo`` ei tee muuta kuin tulostaa omat argumenttinsa. Se on erityisen hyödyllinen esim. skripteissä, joiden halutaan ehkä tulostavan jotakin. Skriptin suorittama "kaiku" päätyy nimittäin esimerkiksi käyttäjälle, joka suoritti skriptin. Tai se voi tallentua lokitiedostoon (kohtapuoleen katsotaan, miten echon tai minkä tahansa ohjelman tulosteet voi kirjoittaa tiedostoihin; tulosteen ohjaaminen toisen ohjelman syötteeksi putken avulla nähtiin jo edellisessä esimerkissä. Kertaa, jos ei muistu heti mieleen! Tee itsellesi tarpeen mukaan muistiinpanoja!). .. Tästä tulin toisiin aatoksiin, eli otetaanpa eri asiana demo 2:ssa niin tuota kommentoin pois tästä kohtaa demo 1:tä kuitenkin.. Sitten koetetaan unohtaa äskeinen, ja opetellaan käyttämään tulostamiseen aina komentoa ``printf``. Tuo ``echo`` on nimittäin nykyisessä POSIX-standardissa merkitty välteltäväksi (eli *deprecated*) ja suositellaan korvattavaksi komennolla ``printf``. Keväällä 2024 osa tehtävistä voi vielä olla päivittämättä nykyaikaan, mutta voit itse tehdä sen. Esimerkiksi äskeisen komennon tilalla pitäisi olla mieluummin tämä:: printf "Mitä printf tekee\n" Huomaa lainausmerkit ja lopussa oleva kenoviiva ja än-kirjain. Tekstitiedostojakin täällä voi tulostaa päätteelle. Komenna:: cat /etc/group Komento ``cat`` on sellainen, että kun sille antaa argumenttina tiedoston nimen, se lukee tiedoston ja tulostaa sen sisällön. (Mahdollista on myös "katenointi" eli usean tiedoston tulostaminen peräkkäin; siitä tulee ohjelman nimi ``cat``. Se ei valitettavasti liittynytkään kissoihin.) Esimerkin tiedosto ``/etc/group`` löytyy joistakin järjestelmistä, kuten meidän suorakäyttökoneiltamme, vaikkei se olekaan laajemman standardin määräämä. Se on tietyn muotoinen tekstitiedosto, joka kertoo koneelle määritellyt käyttäjäryhmät. Näinkin pitkä teksti olisi ehkä parempi lukea interaktiivisella ``less``-ohjelmalla kuten edellä tehtiin. Aiemmassa esimerkissä käytetyn putkituksen sijasta tiedoston voi kertoa lessille suoraan argumenttina:: less /etc/group (Edelleen, lessistä pääsee pois painamalla ``q`` -näppäintä.) Vielä yksi. Komenna:: cat /proc/cpuinfo Tämä kertoo yksityiskohtaista tietoa etäkäyttökoneen prosessoreista, joiden toiminta ja käskykanta ovat yksi tämän kurssin teemoista. Huomataan, että toistaiseksi (tarkistettu keväällä 2024) kone ``jalava.cc.jyu.fi`` näyttäytyy meille neliytimisenä Intel Xeon -prosessorina, jonka virtuaaliosoitteet ovat 48-bittisiä ja fyysiset osoitteet 43-bittisiä. Välihavainto: Ilmeisesti ainakin tällaisia peruskomentoja kuin ``echo``, ``cat``, ``less`` löytyy, ja niiden tulosteita voi ohjata putken kautta syötteeksi toisilleen. Mitäs muuta etäkäyttö-Unixilla voi tehdä? Komenna:: ls /bin/ Tulostui reilu 3005 kappaletta apuohjelmia (lukumäärä tsekattu viimeksi vuonna 2024). Tutki listaa; löydätkö tähän asti kokeilemiesi komentojen nimiä? Vuonna 2024 Jyväskylän yliopiston suorakäyttökoneilla hakemisto on näköjään käytännössä sama kuin ``/usr/bin`` eli seuraava komento antaa meillä saman tulosteen:: ls /usr/bin/ Hakemisto ``/bin`` on tyypillisesti Unixissa perusapuohjelmien sijainti ja ``/usr/bin`` lisättyjen, paikallisesti asennettujen, sovellusten sijainti. Muistanet, mistä kaikki suoritettavat ohjelmat tulevat: ne on jossain vaiheessa käännetty lähdekoodista konekieliseksi binääritiedostoksi. ``bin``-nimisissä hakemistoissa on usein sellaisia ja lisäksi tulkattavia ohjelmia kuten shell-skriptejä. Jokainen voi tehdä itselleen oman kotihakemiston alle kokoelman omia ajettavia ohjelmia ja skriptejä (esimerkiksi itselläni on tehtynä ``/nashome3/nieminen/bin``). .. Nämä ohjelmat löytyvät melko varmasti kaikista unixeista, ja melko varmasti ne löytyvät kaikkialla nimenomaan hakemistosta ``/bin``. Sitten laajennetaan näkökulmaa... pidä tuolista kiinni, kun komennat seuraavan. Yleisimmille Linux-distribuutioille on saatavilla yli 5000 valmiiksi paketoitua ohjelmaa (joillekin vielä enemmänkin), joilla voi tehdä kaikenlaista. Jyväskylän yliopiston digipalveluiden porukka on valinnut jonkinlaisen harkinnan perusteella etäkäyttökoneisiimme asennettavaksi juuri nuo siellä olevat 2900+ ohjelmaa. Ohjelmien paketoinnista vastaa distribuution toimittaja (meidän suorakäyttökoneidemme osalta yritys nimeltä Red Hat) sekä, erityisesti vapaan lähdekoodin maailmassa, vapaaehtoiset apulaiset. Jos distribuution toimittaja ei ole jotakin tarpeellista ohjelmistoa paketoinut, se jää paikallisen ylläpitohenkilöstön tehtäväksi, meillä siis Jyväskylän yliopiston digipalveluiden. Turha varmaan yrittää käydä läpi kaikkia noita tuhansia ohjelmia. Ennemmin kannattaa ehkä keksiä, mitä haluaisit tietokoneella tehdä, ja sitten etsiä Internetistä jollain hakusanoilla tieto siitä, minkä nimisellä ohjelmalla se voidaan Linuxissa tehdä. Tai kysy kokeneemmalta Linux-käyttäjältä vinkkiä. Vaikka onhan mahdollista tutustua mielenkiintoisen nimisiin ohjelmiin sattumanvaraisestikin. Seuraavassa osuudessa katsotaan, miten käyttöohjeet ovat kuoressa aina lähellä. Ennen sitä kerrataan kuitenkin havainnot kuoresta tähän asti: - Kuori antaa sinun kirjoittaa komennon ja odottaa että painat enter-näppäintä. - Sitten kuori suorittaa komennon. Usein se on jonkun ohjelmatiedoston nimi ja ohjelmalle välitettävä argumenttilista. - Argumenteista muodostuu siis lista. Eri argumentit erotetaan toisistaan välilyönnillä. Esimerkiksi C#:lla tai Javalla tehty ohjelma vastaanottaa argumentit ``main``-metodin ``String[] args`` parametrissa. C-kielellä tehty taas saa erikseen lukumäärän ja varsinaiset merkkijonot, kuten tämän kurssin C-kielisissä esimerkeissä tullaan näkemään. - Jos yhteen argumenttiin haluaa sisällyttää välilyönnin, se on mahdollista, mutta se pitää koodata eri tavoin, koska muuten välilyönti tulkitaan eri argumenttien erottimena. Pari mahdollista tapaa:: jokukomento argum1 "argum2 jossa on välilyöntejä" argum3 jokukomento argum1 'argum2 jossa on välilyöntejä' argum3 jokukomento argum1 argum2\ jossa\ on\ välilyöntejä argum3 Kaikki kolme tämän esimerkin komentoriviä ovat olennaisesti samoja. Jokainen niistä ilmoittaa komennolle ``jokukomento`` kolme argumenttia: Ensimmäinen on ``argum1``. Toinen on ``argum2 jossa on välilyöntejä``. Kolmas on ``argum3``. Esim. komento:: java JokuLuokka risto "aliisa lassi" pena aiheuttaa Javalla kirjoitetun metodin JokuLuokka.main() alkuun tilanteen, jossa pätee:: args[0].equals("risto") == true args[1].equals("aliisa lassi") == true args[2].equals("pena") == true Ja edelleen, jos argumentissa on oltava sisällössä merkki ``"`` niin se pitää koodata ``\"``. Samoin ``'`` koodataan ``\'``. Tietyt kuoren erityismerkit on pakko koodata vastaavalla tavoin kenoviivasyntaksilla. Puhutaan "escape sequencesta", olisiko tämä sitten suomeksi "eskeippimerkki" tai "pakomerkki", jolla siis "paetaan" yhden merkin ajaksi normaaleista tulkintasäännöistä. Tämä on sama periaate kuin useissa ohjelmointikielissä esimerkiksi rivinvaihdon tai tabulaattorimerkin koodaus vakiomerkkijonossa (rivinvaihto ``\n``, tabulaattori ``\t``). Ohjelmointi 1 -kurssimme jälkeen tutuimmassa kielessä, C#:ssa, tapahtuu samat asiat pienin syntaktisin eroin. - Ohjelman ns. "valitsimet" (engl. *options*) ovat Unix/Linux-maailmassa usein argumentteja, joiden muoto on ``-v`` tai ``--verbose`` eli niissä on tavuviiva ja kirjain tai vaihtoehtoisesti kaksi tavuviivaa ja kuvaavampi sana. Yksikirjaimisia argumentteja saa useimmiten yhdistää peräkkäin: Esimerkiksi voi kirjoittaa ``-xvz`` sen sijaan että ``-x -v -z``, paitsi jos jokin valitsin edellyttää että seuraava argumentti on esimerkiksi tiedostonimi tyyliin ``-o outputfilename``. Argumenttien käsittely on täysin ohjelmasta riippuvaa, ja ohjelman käyttöohjeisiin täytyy tutustua ennen kuin lähtee sitä käyttämään. POSIX määrittelee yhteensopivassa järjestelmässä välttämättömät apuohjelmat sekä niiden välttämättömät argumentit muotoineen. (Windows-maailmassa usein valitsimet ovat yksikirjaimisia ja alkavat kauttaviivalla.) - "Interaktiivinen kuori" tarkoittaa tätä, että editoit aina yhden komennon kerrallaan interaktiivisesti. Toinen tapa käyttää kuorta on skriptit, joissa kuori suorittaa peräkkäin ohjelmaksi kirjoitettuja komentoja. Puhutaan kuoriohjelmoinnista (tai helposti myös "shell-ohjelmoinnista", kun kielipoliisin korva välttää) tai skriptien tekemisestä. Kuori voidaankin siinä mielessä ajatella tulkattavaksi ohjelmointiympäristöksi, vaikka se on ohjelmointimielessä hiukan köykäinen oikeisiin ohjelmointikieliin verrattuna. Osa 3: Opi, miten opit lisää milloin vain ========================================= Komenna:: man ls Tämä näyttää apuohjelman ``ls`` manuaalin eli käyttöohjeen. Perusasetuksilla manuaali näyttää pitkän tekstinsä käyttämällä ``less``-ohjelmaa, johon tutustuit edellisessä kohdassa. Muistanet, että tekstiä voi selata ylös ja alas nuolinäppäimillä, ja less-ohjelmasta ja manuaalistakin pääsee pois painamalla ``q``-näppäintä. Kokeile. Ohjelman ``ls`` man-sivun eli käyttöohjeen alku sisältää tällaista:: NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort. Mandatory arguments to long options are mandatory for short options too. -a, --all do not hide entries starting with . -A, --almost-all do not list implied . and .. --author with -l, print the author of each file ... Ja tällaisiapa man-ohjeet yleensä ovat. Niissä kerrotaan ohjelman nimi ja tarkoitus (NAME). Sitten kerrotaan tapa, jolla ohjelmaa saa komentaa (SYNOPSIS); eli komennon jälkeen voi yleensä antaa tietyssä järjestyksessä tietynlaisia argumentteja, joista osa voi olla pakollisia ja osa ei-pakollisia. Ei-pakolliset on kirjoitettu hakasulkeisiin. Tässä tapauksessa komennon perään voi laittaa tarkentimia, OPTION, jotka ovat siis vapaaehtoisia, koska [OPTION] on hakasulkeissa. Tarkentimien jälkeen voi olla tiedoston tai hakemiston nimi FILE, joka siis sekin on vapaaehtoinen. Molempia voi olla monta, mikä synopsikseen on merkitty kolmella pisteellä ``...``. Näiden jälkeen kuvaus (DESCRIPTION) kertoo tarkemmin, mitä ohjelma tekee. Ja sitten alkaa tarkentimien kuvaus. Yleensä ohjelmilla on mahdollisia tarkentimia aika paljon, riippuen kuinka monipuoliseen käyttöön ohjelma on tarkoitettu. Selaa huvikseen pari man-sivua, esim. käyttöohjeet edellä kokeilluista komennoista:: man pwd man less Viimeksi mainittu, eli ``less`` -ohjelman manuaalisivu, kertoo mm. suhteesta POSIX-yhteensopivaan ``more`` -ohjelmaan. Vielä enemmän tietoa Jalavaan asennetuista ohjelmista tarjoaa GNU -ohjelmistoissa yleisesti käytetty ``info``-järjestelmä. Kokeile:: info info Info opastaa nyt infon käyttämistä. Info on itse asiassa interaktiivinen, tekstimuotoinen hypertekstijärjestelmä, jonka sisältöihin voi vaikka tutustua myöhemmin omalla ajalla. Info-lukijan oma intro saadaan päälle painamalla ``Shift-H`` (siis iso H; info-ohjelmassa pieni h tekee jotakin muuta). Ja tästähän se opas alkaisi:: 1.2 How to use Info =================== You are talking to the program Info, for reading documentation. Monet tekstimuotoiset sovellukset ovat varsin hyvin dokumentoituja ja käyttäjäystävällisiä -- se ystävällisyys pitää vain hahmottaa "kovan pinnan" alta, joka ainakin aluksi saattaa syntyä siitä tekstimuotoisuudesta ... Melkein kaikesta on joko man-sivu tai info-dokumentaatio. Lisäksi hyvän komentoriviohjelman tunnistaa siitä, että sitä voi komentaa argumentilla ``--help`` näin:: ls --help Silloin ohjelma itse tulostaa pienen perusavustuksen. Komennetaan vielä vaaroihin tottuaksemme tiedoston poistokomennolle seuraavasti:: rm --help Ole tarkkana, ettet vahingossa anna tälle komennolle minkään sellaisen tiedoston nimeä, jota et halua hukata. Ylläolevassa esimerkkikomennossa ei ole tiedoston nimeä vaan ainoastaan valitsin, jolla pyydetään ohjetta. Huomaa muuten, että tiedoston poistamisväline ``rm`` ilmoittaa avustuksessa: "*Note that if you use rm to remove a file, it might be possible to recover some of its contents, given sufficient expertise and/or time*" (sanamuoto oli tämä ainakin 2024-03-21). Tämä tarkoittaa, että jos vieraan valtion agentti varastaa kovalevyn riittävän pian tiedoston poiston jälkeen, niin tietyin keinoin on mahdollista palauttaa ainakin osia tiedostosta. Tietoturvamielessä kannattaisi kirjoittaa ensin arkaluontoisen datan päälle jotain merkityksetöntä tauhkaa, jotta magneettipinta unohtaa historiansa. Tämän tekisi tiedoston silpomisväline ``shred``. Arvatenkin silppurin manuaali kertoo lisää yksityiskohtia. Tietoturva ja sähköinen todistusaineisto eivät ole tämän kurssin ydinsisältöä, joten palataanpa perusasiaan. Kiteytetään vielä kerran: - Tiettyyn Unix-koneeseen asennetut, kaikkien käyttäjien suoritettavissa olevat, ohjelmat voidaan listata jotakuinkin näillä komennoilla:: ls /bin/ ls /usr/bin/ ls /usr/local/bin - Järjestelmän ylläpitoon liittyvät ohjelmat, joista useimpia vain ylläpitäjät voivat ajaa, voidaan listata näin:: ls /sbin/ - Jokaisesta ohjelmasta saa yleensä tietoja paikan päällä komentamalla jompikumpi:: man ohjelmannimi ohjelmannimi --help # tai -h tai -? ... - Tällä kurssilaa tulee jonkin verran tutuksi standardi nimeltä POSIX, joka määrittelee joitain kymmeniä ohjelmia, jotka yhteensopivasta järjestelmästä aina löytyy. Se myös määrittää kyseisille ohjelmille joitakin argumentteja, joita niille voi kaikissa yhteensopivissa toteutuksissa antaa. - (Lisäksi tietenkin Internetistä ja painetuista manuaaleista löytyy ohjeita ja tutoriaaleja pilvin pimein) Osa 4: Tiedostonhallintaa ========================= Käydään juuressa ---------------- .. pwd cd .. ls pwd Mitä tapahtui? Siirryit hakemistopuussa yhtä askelta ylöspäin. Äsken olit Unix-kotihakemistossasi (joka siis Windowsissa näkyy U: -asemana). Nyt oletkin siinä hakemistossa, joka sisältää kotihakemistosi. Shell pitää kirjaa työhakemistosta ja ``pwd`` näyttää, mikä se tällä hetkellä on. HUOM: Joo ei tehdä tätä nyt 2014 - näyttää (ehkä) jumittuvan aika pahasti, ja voipi olla ongelma kaikille käyttäjille(?). Liekö liittyväinen aiemmin havaittuun login-viiveeseen... Komenna:: cd / Mikäs nyt on työhakemisto? Muistat edellisestä, että sen voi aina selvittää komennolla ``pwd``. Komenna:: ls Näyttääkö jotakuinkin tältä:: adminhome boot ... autohome ... automisc ... Kyseessä on Linux-koneen **juurihakemisto** (engl. *root directory*), jonka alla kaikki on. POSIX määrittelee, että juuren nimi on ``/`` ja että sen alta löytyy hakemistot ``/dev/`` ja ``/tmp/``. Muillakin hakemistoilla on useimmissa unix/linux -asennuksissa samat nimet kuin meidän asennuksessamme, ja niillä kullakin on erityismerkitys. Hakemistot ``/bin`` ja ``/usr/bin`` tulivat tutuiksi aiemmin; niissä on käynnistyskelpoisia ohjelmia. ``/sbin`` sisältää järjestelmänhallintaan liittyviä ohjelmia, joita pääkäyttäjä eli "root" voi hyödyntää interaktiivisesti sekä ylläpitoskriptien osana. ``/lib`` ja ``/usr/lib`` sisältävät aliohjelmakirjastoja, joita voidaan linkittää ohjelmiin. ``/lib64`` ja ``/usr/lib64`` sisältävät kirjastojen aidosti 64-bittiset versiot. Sattuneista syistä nykyisissä 64-bittisissä koneissa joudutaan ajamaan vielä myös 32-bittisiä ohjelmia ja kirjastoja, mistä syystä hakemistot on täten eriytetty toisistaan (tilanne tarkistettu viimeksi vuonna 2024 tätä demoa varten). Hakemisto ``/home`` on yleensä se, missä kotihakemistot eli käyttäjien omat tiedostot sijaitsevat. Yliopistolla on kuitenkin niin paljon porukkaa, että levyjärjestelmä on ylipäätään aika massivinen ja sen lisäksi kotipäähakemistoja on monta, eli vuonna 2020 näyttää olevan ``nashome1``, ``nashome2``, ..., ``nashome9``. **Älä ota listausta** noiden verkkolevyjen koko sisällöstä juuri nyt. Verkkolevyn 16000+ käyttäjän hakemistojen läpikäynti näyttää (ainakin v. 2015-2016) jumittuvan aika pahasti, mikäli on kulunut pitkä aika edellisestä listauksesta. *Jätetään toistaiseksi mieluusti listailematta* nämä ``nashome``:t, vaikka se mukavaa olisikin. (... voi olla, että ongelma on korjattu 2017, mutta vanhalta muistilta tulee oltua hiukan varovainen. Aiempina vuosina netissä näyttäisi olleen vastaavasta ongelmasta bugiraportteja, viitaten tilanteeseen, että uudet käyttäjät eivät pääse kirjautumaan ilman merkittävää viivettä silloin, kun toinen ohjelma käy läpi käyttäjätietoja. *Listaillaan me nyt siis vaan kohteita, joissa ei tarvitse selata tuhansia käyttäjiä*. Ainakin kaikki oman kotihakemiston alla tehdyt listaukset ovat täysin haitattomia muille.) Hakemistossa ``/boot`` on käyttöjärjestelmäytimen käännetty konekielikoodi, joka käynnistyksen (engl. *boot*) yhteydessä ladataan. ``/var`` sisältää mm. lokitietoja järjestelmän toiminnasta ("var"=="variable content"). ``/etc`` sisältää eri ohjelmien asetuksia ("etc"=="et cetera"). ``/tmp`` sisältää ohjelmien väliaikaisia tiedostoja ("tmp"=="temporary"). Eksoottisempia hakemistoja ovat ``/proc`` ja ``/dev``. Ensiksi mainitussa on ajonaikaisten ohjelmien (eli *prosessien*, engl. *process*; tämä termi tulee vahvaan rooliin kurssin edetessä) tietoja ja jälkimmäisen kautta pääsee käsiksi laitteisiin (engl. *device*). Unixissa (ja sen "perillisessä" Linuxissa) tiedostojärjestelmän kautta hallitaan muutakin kuin tiedostoja! Tai siis kaikki asiat näyttäytyvät tiedostoina tiedostojärjestelmän ja hakemistorakenteen kautta. Jos lyhyiden nimien taustat kiinnostavat enemmän, esimerkiksi StackExchangen Server Faultissa on asiaa kysytty ja vastattukin aika uskottavalla tavoin: https://serverfault.com/questions/24523/meaning-of-directories-on-unix-and-unix-like-systems (linkin toimivuus tarkistettu viimeksi 21.3.2024) Unixin hakemistorakenne juuresta alkaen on tässä mielessä looginen ja selkeä. Fyysisten kovalevyjen eri tiedostojärjestelmät, verkkolevyt ja jopa ohjelmat ja laitteetkin löytyvät nätisti omilta paikoiltaan - kaikki saman juurihakemiston ``/`` alta. Löydätkö kotiin? Eli muistatko ulkoa kotihakemistosi nimen, jos nyt pitäisi mennä esim. niinku meikäläinen:: cd nashome3 cd nieminen Ei hätää, jos et muista. Komenna:: cd Kokeile esim. ``pwd``-ohjelmalla, että olet taas kotihakemistossasi. ``cd`` -komento ilman argumentteja siirtää kotihakemistoon. Itse asiassa ``cd`` ilman parametreja on sama kuin komento:: cd $HOME missä ``$HOME`` on ns. ympäristömuuttuja (engl. *environment variable*). Mutta ympäristömuuttujista tulee lisää asiaa varmaan jossain myöhemmässä vaiheessa kurssia. Tehdään hakemistoja ------------------- Tehdään verkkolevyllesi hakemisto Käyttöjärjestelmät-kurssin ensimmäistä demoa varten. Saat valita minkä tahansa hakemistonimen; esimerkissä on ``kj24`` koska mun mielestä se on ihan kiva nimi hakemistolle, jossa on käyttöjärjestelmäkurssin asioita vuoden 2024 keväällä. Ääkkösiä ja erikoismerkkejä kannattanee vielä tänäkin päivänä välttää tiedostonimissä, koska niiden koodauksen standardit ovat laahanneet hiukan perässä järjestelmien välillä, ja maailmalla on käytössä laitteita, joiden tiedostojärjestelmät ovat peräisin vuosikymmenten takaa. Välilyöntejä saa periaatteessa olla, mutta niiden kanssa on oltava tarkkana, koska tosiaan mm. kuorikomennoissa välilyönti ilman erityismerkkausta tulkitaan erotinmerkiksi argumenttien välillä! Komenna:: mkdir kj24 Sitten mene juuri luotuun hakemistoon:: cd kj24 Jos haluat varmistua hakemiston vaihtumisesta, voit käyttää taas ``pwd`` -komentoa... Komenna seuraavasti:: mkdir demo{1,2,3,4} Tarkista tulema komentamalla:: ls Mitä tapahtui? Interaktiivisissa kuorissa on tiettyjä tehokäyttöominaisuuksia. Yksi esimerkki on tämä ``bash``-kuoren ominaisuus, jossa komentoriville kirjoitettu teksti ``jotakin{muuta,puuta,juu}`` korvautuu ennen komennon suorittamista yhdistelmällä ``jotakinmuuta jotakinpuuta jotakinjuu``. Kun tästä tulee refleksi, muuttuu aika monen asian tekeminen nopeammaksi. (Huom: mm. tämä on esimerkissä käytetyn bash-kuoren teho-ominaisuus, jota POSIX ei välttämättä määrittele - tarkista itse jossakin vaiheessa; kyky lukea mm. POSIXin tekstiä on kurssin osaamistavoite...) Kokeile:: echo {aa,bee}{1,2,3}{X,Y} Jännää, eikö. Jätetään asia "hautumaan" ja siirrytään seuraavaan. Osa 5: Temppuja =============== Eri kuoret toimivat monella tapaa erilaisesti, mutta jotkut asiat ovat yhteisiä monille niistä. Ainakin seuraavien ominaisuuksien pitäisi toimia ainakin sekä ``bash`` että ``tcsh`` -kuorissa. Moni asia on myös esim. POSIX-standardin määrittelemää, joten vastaavaa on käytettävissä kaikissa järkevissä kuorissa. Kuitenkin mm. näppäinyhdistelmät voivat olla ihan erilaisia. (TODO: Jos joku haluaa selata, mitä, jos mitään, POSIX sanoo interaktiivisesta komentorivistä ja mahdollisesti näppäinyhdistelmistä, sen saa ilman muuta tehdä; itselläni ei ole vielä ollut aikaa; tässä kerrotut asiat toimivat kokeillusti yliopistomme suorakäyttökoneille asennetussa bashissa.) Interaktiivisuuden tehostamista ------------------------------- Pitkien rimpsujen kirjoittaminen on hidasta (verrattuna esim. klikkaamiseen hiirellä), mutta näppäimistön käyttö sinänsä on nopeata, jos näppäinpainallusten määrää saadaan rajoitettua. Kokeilepa seuraavaa: - Paina nuolta ylöspäin ja katso mitä tapahtui! (Saat edellisen komennon, jonka voit antaa uudelleen ihan vaan painamalla enteriä). Komennon toistaminen vaatii siis vain kaksi näppäinpainallusta. - Painelepa nuolta ylöspäin useampia kertoja. Saat aina edellisen ja edellisen komennon. - Nuoli alaspäin selaa tietysti toiseen suuntaan. Tämän nimi on *komentohistoria* ja se on kätevä juttu. Jos haluat uudelleen komennon, jonka teit pari askelta sitten, se löytyy muutamalla painalluksella. Sitten katsotaan rivin editointia: - Selaa historiasta tuo äskeinen komento:: echo {aa,bee}{1,2,3}{X,Y} Nuolilla vasemmalle ja oikealle voit siirtää kursoria komentorivillä vanhan komennon päälle. Muuta se seuraavanlaiseksi siten, että vaihdat ainoastaan ``X``-kirjaimen ``Z``-kirjaimeksi:: echo {aa,bee}{1,2,3}{Z,Y} Suorita. Suorita vielä komentohistoriaa käyttämällä nämä vähän eri komennot:: echo {aa,bee}{1,2,3}{W,Y} echo {aa,bee}{1,2,3}{kuu,Y} echo {aa,bee}{1..15}{kuu,Y} - Katsotaanpa lisää näppäinpainallusten välttämistä. Ota historiasta vielä tuo edellinen, melko pitkä, komentorivi editoitavaksi. Kokeile näppäimiä ``Ctrl-a`` ja ``Ctrl-e``. Rivin alkuun ja loppuun hyppiminen on nopeaa! .. - Jos pääteyhteysohjelmasi välittää Alt-näppäimen oikein (mikä ei kaikilla pääteyhteysohjelmilla ole varmaa...), voit hyppiä kokonainen sana kerrallaan painamalla Altia ja nuolinäppäimiä vasemmalle ja oikealle. - Luovutaan käsien siirtämisestä nuolinäppäimille: Voit mennä rivillä eteenpäin painamalla ``Ctrl-f`` ("f" niinkuin "forward") ja taaksepäin painamalla ``Ctrl-b`` ("b" niinkuin "backward"). Edelliseen komentohistorian komentoon pääsee ``Ctrl-p`` ("p" niinkuin "previous") ja seuraavaan ``Ctrl-n`` ("n" niinkuin "next"). Ei jaksa siirtää käsiä nuolinäppäimille enää? - Ja vielä lisää. Tyhjennä komentorivi menemällä sen alkuun (``Ctrl-a``) ja sitten tyhjentämällä loppuosa rivistä (``Ctrl-k``). Laitakin se takaisin (``Ctrl-y``)... Komentorivin editointi on tehty nykyisissä kuorissa monella tapaa tehokkaaksi. Tässä vielä yksi tapa: - Kirjoita tyhjän rivin alkuun ``less /u`` ja paina sen jälkeen tabulaattoria eli sarkainnäppäintä. Huomannet, että kuori osaa tutkia hakemistorakennetta ja täydentää sinne hakemiston tai tiedoston nimen aina siihen asti kuin se on yksikäsitteinen. Tässä tapauksessa komentorivilläsi pitäisi olla edellisten kahdeksan näppäilyn jälkeen teksti ``less /usr/`` Jatka kirjoittamalla perään ``i`` eli ``less /usr/i`` ja paina taas tabulaattoria. Nyt rivillä on ``less /usr/include/``. Näppäile ``mat`` ja vielä kerran tabulaattori. Rivillä on nyt komento:: less /usr/include/math.h Kun tästä tulee refleksi, on tiedostojen löytäminen erittäin syvistäkin hakemistorakenteista helppoa ja nopeaa interaktiivisen kuoren avulla. Ainakin bashissa myös yhdistelmä ``Ctrl-i`` toimii kuten tabulaattori, ja se saattaa olla pienemmän sormiliikkeen takana kuin tabulaattori. Voit myös suorittaa tuon viimeisimmän komennon, jos haluat: Less-ohjelmallahan voi selata tekstitiedostoja nuolinäppäimillä interaktiivisesti. Ja näppäin ``q`` lopettaa sen. Edellä paikannetussa tiedostossa on C-kielen matematiikkakirjaston rajapintaa, mm. Piin likiarvon ja muiden vakioiden määrittelyjä; miten tämä taas liittyy tähän kurssiin mitenkään? Esimerkiksi siten, että käyttöjärjestelmästandardi POSIX sisältää osia C-kielen standardista, mukaanlukien ``math.h``:n välttämättömän sisällön yhteensopivissa järjestelmissä. Eli käyttöjärjestelmästandardi voi ottaa välillisesti kantaa myös ympyrän kehän suhteeseen sen halkaisijaan (tai ainakin nyt nimeen, jolla tuollaiseen suhdelukuun voi viitata yhteensopivassa ohjelmakoodissa). Useamman ohjelman käyttöä, putkittaminen ---------------------------------------- Kokeile seuraavia perusesimerkkejä Unixin ideologiasta "paljon pieniä ohjelmia, jotka tekevät yhden asian hyvin ja joita voi yhdistellä monimutkaisempien ongelmien ratkaisemiseksi". Niissä käytetään aiemmin ``less``-ohjelman yhteydessä nähtyä putkittamista. Aloitetaan vaikkapa komentamalla:: who | sort Who-ohjelman tuloste menee sortille, joka lajittelee rivit aakkosjärjestykseen. Kokeile sitten seuraavaa:: who | cut -c-8 | sort | uniq Who-ohjelman tuloste menee tässä cutille, joka leikkaa kahdeksannen merkin kohdalta aina rivin poikki; sitten leikatut rivit menevät cutilta sortille ja lopulta ohjelmalle ``uniq`` joka jättää peräkkäisistä samoista riveistä vain yhden jäljelle. Lopputuloksena on aakkosjärjestyksessä kaikki käyttäjät vain yhteen kertaan listattuna, vaikka heillä olisi useita rinnakkaisia pääteistuntoja auki. Vielä yksi:: who | cut -c-8 | sort | uniq | wc -l Tässä vielä ``uniq``-ohjelman tulos putkitetaan ``wc``:lle, joka laskee rivien määrän (viimeinen merkki komennossa on ällä eikä ykkönen!). Lopputuloksena on kuorikomentojen ketju, joka laskee konetta tällä hetkellä käyttävien henkilöiden määrän. Huomautus 1: Pitkät putkitukset ohjelmalta toiselle ovat tuhlailevaisia, koska jokainen ohjelma on käynnissä yhtäaikaa. Jokainen niistä vaatii käyttöjärjestelmän resursseja, joiden rajallisuuteen tällä kurssilla tutustutaan piakkoin. Putkia on kuitenkin periaatteessa mahdollista tehdä, ja yllä olevat olivat ensimmäisiä oppikirjaesimerkkejä siitä, miten ne toimivat. Ne ovat käteviä, mutta ylenmääräistä putkittamista on hyvä pyrkiä välttämään oikeissa kuoriskripteissä. Huomautus 2: Putki on synkronoitu tuottaja-kuluttaja -toteutus, jonka Unix-järjestelmä tarjoaa palveluna. Tähänkin syvennytään kurssilla myöhemmin. Ohjelmat näkevät niille putkesta tulevat tavut standardina syöttövirtana ja laittavat ulosmenevään putkeen tarkoitetut tavut standardiin tulostusvirtaan. Mistä putki tulee sisään tai mihin se vie ulostulosta, on määrättävissä ulkopuolelta, esimerkiksi kuoren komentoriviltä. Tulosteiden ohjaus tiedostoon ----------------------------- Putkien käytön lisäksi on hyötyä tietää, miten kuorikomennoissa pääsee käsiksi tiedostoihin. Varmistu ensin, että olet äsken tekemässäsi ``demo1`` -hakemistossa, jos olet tehnyt välillä kokeiluja. Toisin sanoen komenna ``pwd`` ja varmista että tuloste näyttää jotakuinkin tältä (tietysti oman kotihakemistosi alla):: /nashome3/nieminen/kj24/demo1 Kokeile ensin grep-ohjelman toimintaa (tuon hirmuisen pitkän tiedostonimen ``config...`` kirjoittamisessa voi kokeilla tabulaattorin käyttöä, kirjoittamalla siitä vain alku, vaikkapa ``con`` ja painamalla tabulaattoria. Täydennys tapahtuu ensin vain siihen asti, kun on yksikäsitteistä. Painamalla tabia kaksi kertaa lisää, tulostuu vaihtoehdot, joista on kirjoitettava taas pari merkkiä lisää, esim. ``15`` ja sitten uudelleen. Tätä toistamalla päädyt yksikäsitteiseen täydennettyyn nimeen, jossa ei pysty olemaan kirjoitusvirheitä, koska se on automaattisesti haettu):: grep TIME /boot/config-2.6.32-642.15.1.el6.x86_64 Lisäksi tämä esimerkki on vuosia vanha, joten tarkoitetun tiedoston nimi tänään on varmasti erilainen. Täydentele siis tabulaattorilla loppuun saakka jokin nimi, joka juuri tänä päivänä alkaa ``/boot/config-`` Näin komennettu ``grep`` etsi toisena argumenttina annetusta linux-ytimen konfigurointitiedostosta kaikki rivit, joilla esiintyy ensimmäisenä argumenttina annettu merkkijono "TIME". Grep on todella hyödyllinen väline isojen tekstimassojen selaamiseen. Kyseinen tiedosto, jota nyt tarkastellaan, sisältää tuhansia rivejä määritelmiä, jotka vaikuttavat syvällisesti siihen, kuinka tämä nimenomainen käyttöjärjestelmäyksilö toimii erilaisissa olosuhteissa ja käyttötarkoituksissa. Pienellä kurssilla ehditään raapaista jonkin verran pintaa osa-alueista, joiden nippelit juuri tuossa tiedostossa on aseteltu. Palataan kuitenkin ainakin toistaiseksi konepellin alla olevista nippeleistä kuoren päälle. Komenna (tietenkin komentohistoriasta nuolinäppäimellä tai ``Ctrl-p``:llä hakien ja äskeistä komentoriviä muokaten):: grep TIME /boot/config-2.6.32-642.15.1.el6.x86_64 > timet.txt Mitään ei tulostunut näytölle. Syy on se, että väkäsellä ``>`` pyysit ohjaamaan ``grep`` -ohjelman tulosteen tiedostoon, jonka nimi on ``timet.txt``. VARO VAARAA taas: Väkäsellä ohjattaessa kohdetiedoston mahdollinen aiempi sisältö tuhoutuu ja se korvataan uudella. Tämän ohjeen turvallisuus perustuu siihen, että olet ohjeen mukaisesti tätä demoa varten luodussa tyhjässä hakemistossa, jossa ei vielä ollut olemassa tiedostoa nimeltä ``timet.txt``. Totea että tiedosto ``timet.txt`` on nyt syntynyt. Komenna:: ls -l Näet mm. jokaisen tiedoston viimeisen muutosajankohdan ja pituuden tavuina, koska ``ls`` hyväksyy valitsimen ``-l`` eli ällä niinkuin "long format". Totea tiedoston sisältö:: cat timet.txt Ohjelma ``cat`` tosiaan tulostaa argumenttina annetun tiedoston. Putkia voi yhdistää ja lopputuloksen voi sijoittaa tiedostoon. Kokeile ja havainnoi:: cat timet.txt | grep HPET > hpetit.txt cat hpetit.txt grep TIME /boot/config-2.6.32-642.15.1.el6.x86_64 | grep SND > soundit.txt cat soundit.txt Huomaa, että ``grep`` -ohjelma osaa toimia joko standardisyöttövirrasta tai lukemalla argumenttina annetun tiedoston. Väkäsellä ohjaus siis korvaa tiedoston aiemman sisällön. Tiedoston peräänkin voidaan kyllä jatkaa; silloin pitää käyttää kahta väkästä peräkkäin ``>>`` eli kokeile vaikkapa seuraavaa ja havainnoi tulokset:: echo "Pari tiedostoa nipussa:" > nippu.txt echo "-------------" >> nippu.txt cat hpetit.txt >> nippu.txt echo "-------------" >> nippu.txt cat soundit.txt >> nippu.txt Miten tulokset siis todetaan? Tiedät jo, eikä seuraavaa vinkkiä tarvittaisi:: cat nippu.txt Enää et myöskään tarvitsisi vinkkiä, että pidempi tiedosto kannattaa mahdollisesti selata sivuttajaohjelmalla, esim:: less nippu.txt Alat jo osata ja muistaa? Hyvä - sitä tavoitellaan! Ehkäpä on kertynyt muistiinpanojakin, koska muisti itsessään on hatara... Huomionarvoinen seikka erityisesti komentorivityöskentelyyn tottumattomille on vaikka edellisten esimerkkien pohjalta tajuta, milloin käytetään komentoa ``echo`` edelleenohjauksen yhteydessä ja milloin sitä ei tarvita. Edelleenohjaus onnistuu ilman komentoa ``echo`` aivan mainiosti, mutta sitä tarvitaan jos halutaan lisätä jotain omaa tekstiä edelleenohjaukseen lisäksi. Voi googlettaa "useless use of echo". Syötteiden lukeminen tiedostosta -------------------------------- Tiedostosta voidaan myös lukea syöte ohjelman standardisyöttövirtaan; silloin käytetään väkästä toisin päin eli ``<``. Kokeile:: less < nippu.txt wc -l < nippu.txt Luettu syöte voi aloittaa putkiketjun:: sort < nippu.txt | uniq | wc -l Silloin se kirjoitetaan ensimmäisen ohjelman perään, ja ensimmäinen putkimerkki on tämän kokonaisuuden jälkeen. Vielä pari kuorikikkaa ----------------------- Komenna:: echo Oletko `whoami` vai kuka Eli kuori suorittaa "backtick" -merkkien välissä olevan tekstin *komentona* ensin ja sijoittaa sen antaman tulosteen komentoriviin, joka sitten suoritetaan. Tämä on usein hyödyllinen kikka skripteissä - toimii tietysti lähinnä ohjelmille, jotka tulostavat vain vähän. Komento ``echo`` olikin varmaan jo aiemmasta kohdasta tuttu. Jos sattui unohtumaan, niinkuin normaalia on, komento ``man echo`` tietysti muistuttaa asiasta. Huomaa, että "backtickien" välissä voi olla täydellinen kuorikomento, jossa voi siis olla vaikkapa putkitus:: echo Paikalla on `who | cut -c-8 | sort | uniq | wc -l` kayttajaa Näitä voi olla komennossa monta, kuten seuraavassa esimerkissä. Se ei mahdu yhdelle riville paperitulostetta, joten siinä käytetään tyypillistä rivinjatkomenettelyä kenoviivalla: voit näppäillä enterin välittömästi kenoviivan ``\`` jälkeen kertoaksesi kuorelle, että aiot jatkaa vielä komentoa seuraavalle riville, tai sitten voit jättää kenoviivat pois ja laittaa koko komennon samalle riville. Mieluiten tietysti otat komentohistoriasta edellisen rivin ja muokkaat siitä vain alkupuolen uusiksi:: echo `whoami` laski `date` etta paikalla on \ `who | cut -c-8 | sort | uniq | wc -l` kayttajaa Ja niin edelleen. Tällaisia tietovirtojen ohjauksia voi tehdä kuorissa. Näitä sovelletaan jatkossa, joten tätä kannattaa jumpata. Muista tärkein perusohje: varmista etukäteen, että tiedät, mitä kokeilusi tulee aiheuttamaan, ettei vahingossa tuhoudu mitään. Mistä saat täydellisen opastuksen käyttämääsi kuoreen ------------------------------------------------------ Jos et vielä arvannut, niin paljastan suuren salaisuuden:: man bash man tcsh Ja niin edelleen (``ksh``, ``zsh``). Kuorien manuaalit ovat pitkiä (koska ohjelmissa on paljon ominaisuuksia selitettävänä) ja aluksi ehkä hiukan vaikealukuisia (koska ne on tehty hyödyttämään tehokäyttäjää tehokkaalla tavalla). Ne kertovat kaikki kikat, joita kullakin kuorella voi käyttää, sekä myös kyseisen kuoren skriptiohjelmoinnin mahdollisuudet. POSIX-yhteensopivassa kuoressa on oltava standardin määrittelemät ominaisuudet, mutta useimmissa on runsaasti laajennoksia. Tällä kurssilla käytämme jatkossa yksinomaan bashia, mutta pidetään POSIX tyynyn alla ja yritetään hahmottaa jotakin myös standardin määräämän osajoukon laajuudesta. Kuorista on myös määrättömän paljon hyviä johdantoja Internetissä. Niistä osa on kirjoitettu myös vasta-alkajille -- eli ei muuta kuin hakukone käyttöön, jos asia alkaa kiinnostaa enemmän! Osa 6: Pakollinen palautustehtävä ================================= **HUOM:** Keväällä 2024 joillain saattaa automaattisesti olla oletuksena kuori ``tcsh`` eikä ``bash``. Voit huomata tilanteen komennon ``ps -f`` tulosteesta. Jos haluat olla jo tässä vaiheessa viimeisen päälle yhteensopiva, voit pyytää tcsh-kuorta muuntautumaan bash-kirjautumiskuoreksi antamalla seuraavan komennon: ``exec bash -l`` jossa viimeinen välilyönnillä erotettu osa on miinusmerkki ja pieni äl-kirjain. Kirjasimesta riippuen pieni äl voi olla hyvin saman näköinen kuin ykkönen, iso ii-kirjain tai tolppamerkki. (Myöhemmin selviää, mitä tarkoittaa, että POSIX-käyttöjärjestelmätoiminto "exec" pyytää käyttöjärjestelmää korvaamaan nykyisen prosessin uudella, joka vastaa exec-toiminnossa mainitun komennon suorittamista mahdollisine argumentteineen) **HUOM:** Keväällä 2024 kurssin demojen palautus tehdään Moodleen. Kunkin palautuslaatikon avautumisesta ilmoitetaan Moodlen Uutiset-tiedotuskanavalla sitten, kun olemme ehtineet testata palautuksen, osasuoritusmerkintöjen ja palautteenannon yksityiskohdat. Siihen asti osannet pitää vastaustiedostosi tallessa verkkolevylläsi siinä hakemistorakenteen alipuussa, joka tässä demossa tehtiin. On myös mahdollista, että teemme (jonakin vuonna) esitarkistimen, jolla voit jo ennen palautusta kokeilla, että vastaus on todennäköisesti oikean muotoinen. Tästäkin informoidaan, jos sellainen joskus tulee. Vielä keväällä 2024 ole itse huolellinen. Voit tutkia tiedostoa ennen palautusta jo opituilla tavoilla eli komennoilla ``cat`` ja ``less`` ja ``hexdump``. Kotoa käsin palautettaessa tiedosto on saatava yliopiston verkkolevyltä ensin omalle koneelle. Ohjeita kotipalauttajille erillisellä sivulla: http://users.jyu.fi/~nieminen/kj24/demovedokset/tekniset_ohjeet_kotipalautus.html Tästä demosta palautetaan tasan yksi tiedosto nimeltään "vastaus.txt", joka on luotu täsmälleen seuraavalla tavoin: 1. Tee aiemmin luotuun demohakemistoosi ``demo1`` tiedosto nimeltä ``vastaus.txt``, jossa on sisältönä ``whoami`` -ohjelmalla tulostamasi käyttäjänimi. Sovella tietysti aiemmin nähtyä tiedostoon ohjaamismenettelyä - älä edes yritä kirjoittaa tiedostoa tekstieditorilla ja copy-paste -menettelyillä, koska siitä tulee silloin todennäköisesti erilainen (mm. unix-rivinvaihto on eri kuin Windowsissa, editori saattaa laittaa alkuun tiettyjä Unicodeen liittyviä erikoismerkkejä, ja editorilla tulee myös liian helposti ylimääräisiä välilyöntejä tai muuta asiaan kuulumatonta)! Tässä harjoitellaan nyt interaktiivisen kuoren hallittua käyttöä, joten kaikki osavaiheet tehdään sillä. .. Palautusjärjestelmän ominaisuuksien vuoksi tämän tehtävän sisältöä käytettäneen myös tunnistamaan vastaajan identiteetti, joten jos "huijaat" jotenkin, niin huijaa sitten edes siten, että ensimmäinen rivi tiedoston alusta unix-rivinvaihtoon asti sisältää oikeasti tasan tarkkaan yliopiston käyttäjätunnuksesi eikä mitään muuta :) 2. Jatka tiedostoa niin, että seuraavalle riville tulee komennon ``date`` tuloste. 3. Jatka tiedostoa edelleen komennon ``uname -a`` tulosteella 4. Jatka tiedostoa edelleen komennon ``ps -f`` tulosteella 5. Laita loppuun vielä komennon ``pwd`` tuloste. 6. Tarkista, että tiedoston sisältö näyttää pääpiirteissään seuraavan esimerkin kaltaiselta (ajankohdat, tunnukset ja numerot tietysti ovat yksilölliset, yksityiskohdat ovat voineet muuttua vuoden 2024 ja sen sellaista):: nieminen Wed 6 Nov 11:40:51 EET 2024 Linux halava.cc.jyu.fi 5.14.0-427.37.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Sep 13 12:41:50 EDT 2024 x86_64 x86_64 x86_64 GNU/Linux UID PID PPID C STIME TTY TIME CMD nieminen 3061589 783478 0 11:21 pts/66 00:00:00 /bin/bash nieminen 3062660 3061589 0 11:41 pts/66 00:00:00 ps -f /nashome3/nieminen/kj24esim/demo1 7. Kannattaa tarkistaa myös komennolla ``hexdump -C vastaus.txt | head`` ettei tiedoston alussa faktisesti ole muuta kuin käyttäjätunnus ja unix-rivinvaihto (heksana merkki ``0a``), esim.:: 00000000 6e 69 65 6d 69 6e 65 6e 0a 57 65 64 20 20 36 20 |nieminen.Wed 6 | 00000010 4e 6f 76 20 31 31 3a 34 30 3a 35 31 20 45 45 54 |Nov 11:40:51 EET| 00000020 20 32 30 32 34 0a 4c 69 6e 75 78 20 68 61 6c 61 | 2024.Linux hala| 00000030 76 61 2e 63 63 2e 6a 79 75 2e 66 69 20 35 2e 31 |va.cc.jyu.fi 5.1| ... 8. Palauta syntynyt tiedosto Moodleen, kunhan palautuslaatikon aukeamisesta on ilmoitettu.