Ero sivun ”Komentojen ajastaminen” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (ei enää yhteistyö)
p (→‎cron: - koitin saada hieman koherenssia ja lisäsin tietoa virroista ja anacronista.)
Rivi 49: Rivi 49:
== cron ==
== cron ==


Aloita komentamalla
Cronilla siis voidaan ajoittaa toistuvia tapahtumia. Komento ''cron'' itsessään on ajatuksen teknisestä toteutuksesta huolehtiva [[daemoni]], eikä tavan käyttäjälle juuri tule tarvetta käyttää sitä. Ajastamiseen käytetään komentoa ''crontab'', joka käsittelee samannimistä asetustiedostoa. Tässä tuleekin huomata eräs [[man]]-komennon piirre; <tt>man crontab</tt> kertoo miten crontab-komento toimii. Sen sijaan mikäli halutaan tietoa crontab-tiedoston formaatista, täytyy manille kertoa myös mistä osastosta (section), halutaan crontab-niminen manuaalisivu, oikea komento tällöin on <tt>man 5 crontab</tt>.


EDITOR=emacs crontab -e
Cron ei aja komentoja - tietenkään - silloin kun tietokone ei ole käynnissä tai siinä ajetaan jotakin muuta käyttöjärjestelmää. Se ei myöskään huolehdi siitä, että tällaisen tauon aikana tapahtumaan säädetyn työt tulisivat ajetuksi sen jälkeen, kun Linux taas käynnistetään. Jos näin halutaan tapahtuvan, pitää asentaa ''anacron''.


(Jos emacs ei ole tuttu, laita sen tilalle esim. vi tai nano.) Tekstieditori avautuu. Kirjoita tiedostoon vain yksi rivi: "* * * * * date >> /tmp/aika". Tallenna tiedosto, jolloin kone vastaa "crontab: installing new crontab". Odota pari minuuttia. Nyt tiedostossa /tmp/aika pitäisi olla date-komennon tulostus minuutin välein.
Crontabia säädetään komennolla <tt>crontab -e</tt>. Tällöin crontab-tiedostosi aukeaa siihen editoriin, joka on määritelty ympäristömuuttujassa EDITOR. Voit valita tämä käynnistämällä ohjelman lisämääreellä <tt>EDITOR=emacs crontab -e</tt>. Pysyvästi voit vaikuttaa tähän muuttujaan kirjoittamalla kotihakemistossasi olevaan ''.bashrc''-tiedostoon esimerkiksi rivin <tt>export EDITOR="editorisi_nimi"</tt>. Hyviä vaihtoehtoja ovat esimerkiksi ''vim'', ''emacs'' ja ''nano -w'' - jälkimmäisessä tulee asetustiedostoja ja muita vastaavia käytettäessä muistaa -w -valitsin, jottei Nano rivittämällä rikkoisi koodia.


Komento crontab avasi tiedoston, jota kutsutaan myös nimellä crontab. Tämän tiedoston muoto on varsin yksinkertainen: aika, välilyönti, komento. Aika taas koostuu viidestä kentästä: minuutti, tunti, kuukaudenpäivä, kuukausi ja viikonpäivä. Tähti tarkoittaa mitä vain, viisi tähteä siis asiaa joka tehdään joka minuutti.
(Jos emacs ei ole tuttu, laita sen tilalle esim. vi tai nano.) Tekstieditori avautuu. Kirjoita tiedostoon vain yksi rivi:
* * * * * date >> /tmp/aika


Esimerkiksi rivi
=== Ajan esitysmuoto ===
 
Crontab-tiedoston rivi koostuu yleensä kahdesta kentästä, viisiosaisesta aikakentästä ja siitä komennosta, joka on tarkoitus ajastaa. Osat ovat järjestyksessä '''minuutti''', '''tunti''', '''kuukaudenpäivä''', '''kuukausi''' ja '''viikonpäivä''' - sunnuntai on sekä päivä 0 että 7.  Tähti tarkoittaa, että mikä tahansa arvo kelpaa, viisi tähteä siis asiaa joka tehdään joka minuutti (kannattaa tietenkin varmistua, ettei suoritettava asia kestä yli minuuttia!).
 
Täten rivi


  30 7 13 * 5 mail -s 'Voi olla epäonnenpäivä' oma@osoite.example
  30 7 13 * 5 mail -s 'Voi olla epäonnenpäivä' oma@osoite.example
Rivi 63: Rivi 68:
tarkoittaa että joka kuu ('*'), kun on 13. päivä tai perjantai ('5', viikon viides päivä), lähetetään meiliä kello 7:30 (minuutikenttä '30', tuntikenttä '7').
tarkoittaa että joka kuu ('*'), kun on 13. päivä tai perjantai ('5', viikon viides päivä), lähetetään meiliä kello 7:30 (minuutikenttä '30', tuntikenttä '7').


=== Ajan esitysmuoto ===
Yksinkertaisimmillaan aikakentän osa on pelkkä numero, eli "30 * * * *" tarkoittaa komentoa joka suoritetaan "aina puolelta". Se voi olla myös numeroluettelo tai aikaväli, "29,30,31 * * * *" ja "29-31 * * * *" tarkoittavat molemma "puolelta sekä minuutti ennen ja jälkeen". Välejä voi luetellakin, "10-19,30-39,50-59 * * * *" suorittaisi komennon aina kymmenen kertaa minuutin välein ja pitäisi sitten kymmenen minuutin tauon. Tasavälien kinilmaisemiseen on lyhennysmerkintä. "*/2 * * * *" tarkoittaa "tasan", "kaksi yli", "neljä yli" ja niin edelleen. "10-20/3 * * * *" on sama kuin "10,13,16,19 * * * *".
 
Kaikki nämä kentät voi yhdistää. Esimerkiksi "*/5 8-16 * * 1-5" tekisi jotain viiden minuutin välein "työaikaan", ts. maanantaista perjantaihin kello 8-16.
 
Viikonpäivistä sunnuntain voi merkitä joko '0' tai '7'. Viikonpäivät ja kuukaudet voi merkitä lyhenteillä: "0 0 1 jan mon" ajaa komennon keskiyöllä joka tammikuun maanantai sekä aina uudenvuodenpäivänä. Välejä ei voi käyttää lyhenteiden kanssa, eli viikonpäivämerkintää 1-5 ei voi korvata merkinnällä mon-fri.
 
Ainoa hankalasti muistettava asia on kuukaudenpäivän ja viikonpäivän yhdistelmä. Ne tulkitaan "tai" eikä "ja", eli cron ei osaa suoraan ajaa komentoja kun on sekä kuun 13. päivä että viikon 5. päivä eli perjantai.


Yksinkertaisimmillaan aikakentän osa on pelkkä numero, eli "30 * * * *" tarkoittaa komentoa joka suoritetaan "aina puolelta". Se voi olla myös numeroluettelo tai aikaväli, "29,30,31 * * * *" ja "29-31 * * * *" tarkoittavat molemma "puolelta sekä minuutti ennen ja jälkeen". Välejä voi luetellakin, "10-19,30-39,50-59 * * * *" suorittaisi komennon aina kymmenen kertaa minuutin välein ja pitäisi sitten kymmenen minuutin tauon.
Useimmissa distroissa on oletuksena asennettu Vixie Cron, jossa viisiosaisen kentän voi halutessaan korvata valmiilla lyhenteellä, joita ovat @reboot (koneen käynnistyksen yhteydessä), @yearly tai @annually (vuoden vaihtuessa), @monthly (kuun vaihtuessa), @weekly (viikon vaihtuessa), @daily tai @midnight (keskiyöllä) tai @hourly (tunneittain).


Tasavälien ilmaisemiseen on lyhennysmerkintä. "*/2 * * * *" tarkoittaa "tasan", "kaksi yli", "neljä yli" ja niin edelleen. "10-20/3 * * * *" on sama kuin "10,13,16,19 * * * *".
=== Komentojen tulosteet ===


Kaikki nämä kentät voi yhdistää. Esimerkiksi "*/5 8-16 * * 1-5" tekisi jotain viiden minuutin välein "työaikaan", ts. maanantaista perjantaihin kello 8-16.
Paitsi tekevät monia asioita, ajettavat komennot usein tulostavat jotakin vakiotuloste- tai virhevirtaan. Mikäli koneessa on toimivaksi säädetty sähköpostijärjestelmä, tuloste lähetetään käyttäjälle sähköpostillä. Tämän tarkoituksenmukaisuus tietenkin riippuu tapauksesta. Usein esimerkiksi on toivottavaa, että normaalisti käyttäjää ei vaivata, mutta jos jokin menee vikaan, voidaan virheilmoitus lähettää. Useat komennot eivät oletuksena tulostakaan mitään tai ne voidaan komentaa olemaan hiljaa, mutta mikäli ohjelma ei ole tällainen, voidaan sen syöte ohjata "roskiin" > -operaattorilla:


Viikonpäivistä sunnuntain voi merkitä joko '0' tai '7'. Viikonpäivät ja kuukaudet voi merkitä lyhenteillä: "0 0 1 jan mon" ajaa komennon keskiyöllä joka tammikuun maanantai sekä aina uudenvuodenpäivänä. Välejä ei voi käyttää lyhenteiden kanssa, eli viikonpäivämerkintää 1-5 ei voi korvata merkinnällä mon-fri.
@hourly /usr/bin/foobar 1> /dev/null


Ainoa hankalasti muistettava asia on kuukaudenpäivän ja viikonpäivän yhdistelmä. Ne tulkitaan "tai" eikä "ja", eli cron ei osaa suoraan ajaa komentoja kun on sekä kuun 13. päivä että viikon 5. päivä eli perjantai.
Hieman uhkarohkeampi versio on ohjata roskiin myös virheilmoitukset:


=== Ympäristömuuttujat ===
@hourly /usr/bin/foobar &> /dev/null
Cron hakee joitain tietoja ympäristömuuttujista. Esimerkiksi <tt>crontab -e</tt> -komentoa ajettaessa avataan crontab-tiedosto editoriin, joka on määritelty ympäristömuuttujassa EDITOR. Tällöin voit esimerkiksi avata crontab-tiedoston [[VIM]]-editoriin komennolla
$ EDITOR="vim" crontab -e
Vastaavasti aloittelijaystävällisellä [[Nano]]:lla hoituisi seuraavasti
$ EDITOR="nano -w" crontab -e
-w tarkoittaa, ettei Nano rivitä tiedostoa automaattisesti, mikä on tässä tapauksessa hyvä ominaisuus.


== Tiedostot ==
== Tiedostot ==

Versio 18. tammikuuta 2006 kello 00.05

at-komennolla voit määrätä komentoja suoritettavaksi tietyn ajan kuluttua, vaikkapa lähettää itsellesi sähköpostia kahden päivän ja kolmen tunnin kuluttua nykyhetkestä. cron-komennolla voi suorittaa jonkin komennon tai ohjelman säännöllisin väliajoin, esimerkiksi tehdä varmuuskopiot joka torstai kello 13.00. Kummastakin komennosta on hyvä man-sivu, mutta tiettävästi suomenkielistä täydellistä esitystä komennoista ei ole.

at

Yksinkertaisimmillaan voi testata komentoa

at now + 2 min

tuloksena saat komentokehotteen 'at>'. Voit kirjoittaa siihen vaikkapa komennon "cal > kuukausi.txt" (ilman lainausmerkkejä). Paina enter ja sitten Ctrl+D niin pääset takaisin komentotulkkiin. Nyt voit tarkistaa että tiedostoa kuukausi.txt ei vielä ole. Komennolla atq näet että työsi on odottamassa. Parin minuutin kuluttua tiedoston kuukausi.txt pitäisi ilmestyä.

Saman asian kuin edellä voit tehdä putkea hyödyntäen:

echo 'cal > kuukausi.txt' | at now + 2 min

Jos käytät konetta joka voi lähettää sähköpostia, voit jo hyödyntää edelläolevaa. Esimerkki:

echo "mail -s 'Lopeta koodaus! Mene nukkumaan!' oma@osoite.example" | at now + 3 hour

Yleensä at-komennolle annetaan absoluuttinen aika eikä aikaa suhteessa nykyhetkeen. Esimerkki:

echo 'mail -s "Osta vaimolle kukkia" oma@osoite.example' | at 15:00 2006-03-23

Em. komento siis lähettää sähköpostia 23.3.2006 kello 15. Joskus voi yhdistää absoluuttisen kellonajan ja suhteellisen päivän. Muistutusmeili ylihuomenna tulevasta TV-ohjelmasta lähtee näin:

echo 'mail -s "Kauniit ja rohkeat alkaa" oma@osoite.example' | at 17:00 + 2 day

Ajan esitysmuoto

Kellonajan on aina oltava ennen päivämäärää. Pelkkä päivämäärä tulkitaan tarkoittavan ko. päivänä samaan aikaan kuin komento annettiin. Pelkkä kellonaika tulkitaan seuraavana mahdollisena aikana, eli '12:00' tarkoittaa huomista keskipäivää jos komento annetaan iltapäivällä.

Kellonaika voidaan antaa tunteina ja minuutteina (esim. '15:30'), sekunteja at ei hyväksy. Aika voidaan antaa englantilaisittain am- tai pm-määreellä ('3 am', '5:30 pm'). Ajan perään voi laittaa UTC-tunnuksen jolloin kellonaika katsotaan UTC-ajan mukaan ('15:30 utc'). Edellä oli jo erikoismääre 'now', jota käytetään vain suhteellista aikaa ilmaisemaan. Muita erikoismääreitä on mm. 'teatime' joka tarkoittaa kello neljää iltapäivällä.

Päivämäärän esitystavoista lienee helpoin opiskella VVVV-KK-PP -muoto. Myös kauttaviivoin esitetty muoto käy ('3/26/06'), samoin päivä ja kuukausi ('26 june') tai päivä. kuukausi ja vuosi ('26 june 2006'). Päivämääräksi voi antaa viikonpäivän, 'at tuesday' tulkitaan huomiseksi jos komento annetaan maanantaina, muutoin tulevan viikon tiistaiksi.

On parasta itse käyttää aina samaa esitystapaa, mutta mahdollisten valmiiden skriptien ym. lukemisen vuoksi on hyvä muistaa että muitakin ajan esitystapoja on.

Suhteellinen aika voidaan ilmaista minuutteina, tunteina, päivinä tai viikkoina (esim. 'now + 5 minutes', 'now + 4 hours', 'now + 3 days', 'now + 2 weeks'). Lyhennysmerkintä 'tomorrow' on sama kuin 'now + 1 day'. Absoluuttisen ajan ja suhteellisen lisäyksen useimmat järkevät yhdistelmät toimivat. Esimerkiksi '15:00 2006-06-26 + 2 weeks' toimii. Eräs tapa nähdä mikä on vuoden 2006 sadas päivä on komentaa 'at 2006-01-01 + 99 days, ja katsoa mihin päivää at sijoittaa ajastuksen.

atq ja atrm

Komennolla atq voi katsoa omat at-työnsä. Root näkee sillä kaikkien jonossa olevat at-työt. Komennon tuloste on muotoa

NN VVVV-KK-PP TT:MM a tunnus

jossa NN on työn numero. Työn sisällön saa selville komennolla at -c NN.

at-työn voi poistaa komennolla atrm NN.

cron

Cronilla siis voidaan ajoittaa toistuvia tapahtumia. Komento cron itsessään on ajatuksen teknisestä toteutuksesta huolehtiva daemoni, eikä tavan käyttäjälle juuri tule tarvetta käyttää sitä. Ajastamiseen käytetään komentoa crontab, joka käsittelee samannimistä asetustiedostoa. Tässä tuleekin huomata eräs man-komennon piirre; man crontab kertoo miten crontab-komento toimii. Sen sijaan mikäli halutaan tietoa crontab-tiedoston formaatista, täytyy manille kertoa myös mistä osastosta (section), halutaan crontab-niminen manuaalisivu, oikea komento tällöin on man 5 crontab.

Cron ei aja komentoja - tietenkään - silloin kun tietokone ei ole käynnissä tai siinä ajetaan jotakin muuta käyttöjärjestelmää. Se ei myöskään huolehdi siitä, että tällaisen tauon aikana tapahtumaan säädetyn työt tulisivat ajetuksi sen jälkeen, kun Linux taas käynnistetään. Jos näin halutaan tapahtuvan, pitää asentaa anacron.

Crontabia säädetään komennolla crontab -e. Tällöin crontab-tiedostosi aukeaa siihen editoriin, joka on määritelty ympäristömuuttujassa EDITOR. Voit valita tämä käynnistämällä ohjelman lisämääreellä EDITOR=emacs crontab -e. Pysyvästi voit vaikuttaa tähän muuttujaan kirjoittamalla kotihakemistossasi olevaan .bashrc-tiedostoon esimerkiksi rivin export EDITOR="editorisi_nimi". Hyviä vaihtoehtoja ovat esimerkiksi vim, emacs ja nano -w - jälkimmäisessä tulee asetustiedostoja ja muita vastaavia käytettäessä muistaa -w -valitsin, jottei Nano rivittämällä rikkoisi koodia.

(Jos emacs ei ole tuttu, laita sen tilalle esim. vi tai nano.) Tekstieditori avautuu. Kirjoita tiedostoon vain yksi rivi:

  • * * * * date >> /tmp/aika

Ajan esitysmuoto

Crontab-tiedoston rivi koostuu yleensä kahdesta kentästä, viisiosaisesta aikakentästä ja siitä komennosta, joka on tarkoitus ajastaa. Osat ovat järjestyksessä minuutti, tunti, kuukaudenpäivä, kuukausi ja viikonpäivä - sunnuntai on sekä päivä 0 että 7. Tähti tarkoittaa, että mikä tahansa arvo kelpaa, viisi tähteä siis asiaa joka tehdään joka minuutti (kannattaa tietenkin varmistua, ettei suoritettava asia kestä yli minuuttia!).

Täten rivi

30 7 13 * 5 mail -s 'Voi olla epäonnenpäivä' oma@osoite.example

tarkoittaa että joka kuu ('*'), kun on 13. päivä tai perjantai ('5', viikon viides päivä), lähetetään meiliä kello 7:30 (minuutikenttä '30', tuntikenttä '7').

Yksinkertaisimmillaan aikakentän osa on pelkkä numero, eli "30 * * * *" tarkoittaa komentoa joka suoritetaan "aina puolelta". Se voi olla myös numeroluettelo tai aikaväli, "29,30,31 * * * *" ja "29-31 * * * *" tarkoittavat molemma "puolelta sekä minuutti ennen ja jälkeen". Välejä voi luetellakin, "10-19,30-39,50-59 * * * *" suorittaisi komennon aina kymmenen kertaa minuutin välein ja pitäisi sitten kymmenen minuutin tauon. Tasavälien kinilmaisemiseen on lyhennysmerkintä. "*/2 * * * *" tarkoittaa "tasan", "kaksi yli", "neljä yli" ja niin edelleen. "10-20/3 * * * *" on sama kuin "10,13,16,19 * * * *".

Kaikki nämä kentät voi yhdistää. Esimerkiksi "*/5 8-16 * * 1-5" tekisi jotain viiden minuutin välein "työaikaan", ts. maanantaista perjantaihin kello 8-16.

Viikonpäivistä sunnuntain voi merkitä joko '0' tai '7'. Viikonpäivät ja kuukaudet voi merkitä lyhenteillä: "0 0 1 jan mon" ajaa komennon keskiyöllä joka tammikuun maanantai sekä aina uudenvuodenpäivänä. Välejä ei voi käyttää lyhenteiden kanssa, eli viikonpäivämerkintää 1-5 ei voi korvata merkinnällä mon-fri.

Ainoa hankalasti muistettava asia on kuukaudenpäivän ja viikonpäivän yhdistelmä. Ne tulkitaan "tai" eikä "ja", eli cron ei osaa suoraan ajaa komentoja kun on sekä kuun 13. päivä että viikon 5. päivä eli perjantai.

Useimmissa distroissa on oletuksena asennettu Vixie Cron, jossa viisiosaisen kentän voi halutessaan korvata valmiilla lyhenteellä, joita ovat @reboot (koneen käynnistyksen yhteydessä), @yearly tai @annually (vuoden vaihtuessa), @monthly (kuun vaihtuessa), @weekly (viikon vaihtuessa), @daily tai @midnight (keskiyöllä) tai @hourly (tunneittain).

Komentojen tulosteet

Paitsi tekevät monia asioita, ajettavat komennot usein tulostavat jotakin vakiotuloste- tai virhevirtaan. Mikäli koneessa on toimivaksi säädetty sähköpostijärjestelmä, tuloste lähetetään käyttäjälle sähköpostillä. Tämän tarkoituksenmukaisuus tietenkin riippuu tapauksesta. Usein esimerkiksi on toivottavaa, että normaalisti käyttäjää ei vaivata, mutta jos jokin menee vikaan, voidaan virheilmoitus lähettää. Useat komennot eivät oletuksena tulostakaan mitään tai ne voidaan komentaa olemaan hiljaa, mutta mikäli ohjelma ei ole tällainen, voidaan sen syöte ohjata "roskiin" > -operaattorilla:

@hourly /usr/bin/foobar 1> /dev/null

Hieman uhkarohkeampi versio on ohjata roskiin myös virheilmoitukset:

@hourly /usr/bin/foobar &> /dev/null

Tiedostot

at käyttää oikeuksien tarkistamiseen tiedostoja /etc/at.allow ja /etc/at.deny. Jos kumpaakaan ei ole, kaikki saavat käyttää at-komentoa. Jos /etc/at.allow on, vain siinä luetellut käyttäjät saavat käyttää at-komentoa. Jos at.allow -tiedostoa ei ole, mutta /etc/at.deny -tiedosto on, kaikki ne joiden tunnuksia ei ole at.deny -tiedostossa saavat käyttää at-komentoa. Rootille käyttö on aina sallittu.

Cronissa yleensä joko cron- tai crontab-ryhmään kuuluvilla käyttäjillä on oikeus käytää cronia. Tiedostossa /etc/cron.deny voidaan kuitenkin listata käyttäjiä, jotka kuuluvat kyseiseen ryhmään mutteivät saa käyttää cronia. Cron osaa käyttää pam-moduuleja, mutta aihetta ei käsitellä tässä tekstissä.

at-komennolla ajastetut komennot on tallennettu hakemistoon /var/spool/at. Vastaavasti käyttäjien crontabit ovat hakemistossa /var/spool/cron. Kumpaankin hakemisoon lukuoikeus on vain rootilla.

Hahmotelmaa sisällöstä

  • ympäristömuuttujat
  • cron vs. anacron
  • käyttö roottina vs. userina
  • batch
  • tyypilliset cron-ylläpitoajot
  • /etc/at.deny ym. tiedostot