Komentojen ajastaminen

Linux.fista
Versio hetkellä 11. elokuuta 2005 kello 11.43 – tehnyt 153.1.63.246 (keskustelu)
Siirry navigaatioon Siirry hakuun

Alkuhuomautus: tämä teksti on kehitteillä, ei valmis. Erityisesti tekstissä voi olla virheitä.

at-komennolla voi määrätä komentoja suoritettavaksi tiettyyn aikaan, vaikkapa lähettää itselleeen 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: esimerkkejä

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

at: 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.

at: 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: esimerkkejä

Aloita komentamalla

EDITOR=emacs crontab -e

(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.

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.

Esimerkiksi 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').

cron: 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 ilmaisemiseen 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.

Systeeminlaajuinen crontab

Tyypillisessä Linux-asennuksessa on systeeminlaajuinen crontab, jota käytetään esimerkiksi varmuuskopioiden tekoon, päivitysten asentamiseen ja vanhojen lokitiedostojen tuhoamiseen.

Päätiedostona on /etc/crontab. Sen muoto on muutoin sama kuin käyttäjäkohtaisilla crontabeilla, mutta mukana on uusi kenttä joka kertoo käyttäjätunnuksen. Kenttä on ajan ja komennon välissä, esimerkiksi

0 4 * * * root tar cvzf /var/varmistukset/homet.tar.gz /home

tekee varmuuskopion siten, että tar-komento ajetaan root-käyttäjän tunnuksilla.

Käytännössä tiedostossa on yleensä seuraavantapaisia rivejä:

1 * * * * root run-parts /etc/cron.hourly

10 4 * * * root run-parts /etc/cron.daily

run-parts on yksinkertainen ohjelma, joka vain lukee läpi tietyn hakemiston ja ajaa jokaisen löytämänsä ohjelman tai skriptin. Em. rivit siis tarkoittavat "joka tunti tasan minuutin yli aja hakemiston cron.hourly ohjelmat" ja "joka yö kello 4:10 aja hakemiston cron.daily ohjelmat".

Voit yksinkertaisesti lisätä varmuuskopiointiskriptin hakemistoon cron.daily, eikä sinun tarvitse tietää yksityiskohtia cronin toiminnasta.

cron ja ympäristömuuttujat

crontab voi sisältää myös ympäristömuuttujia. Tyypillinen ympäristömuuttuja on ainakin SHELL. Sen arvo kertoo millä komentotulkilla halutaan komennot suorittaa (ellei sitä ole määritelty, käytetään käyttäjän normaalia login-shelliä). Yleensä myös PATH määritellään, jotta tulee suoritettua varmasti oikeita komentoja.

Ympäristömuuttujan arvot annetaan yksinkertaisesti muuttuja=arvo -riveinä. Esimerkki systeeminlaajuisesta crontabista:

VARMISTA=/var/varmistukset 30 1 * * * root tar xvzf $VARMISTA/home.tar.gz /home 30 4 * * * root scp $VARMISTA/home.tar.gz tunnus@toinenkone.example

esimerkki on kuvitteellinen, käytännössä on helpompi tehdä varmistuksesta oma skriptinsä.

anacron vs. cron

Perinteisesti crontabeja lukee cron-demoni, yleensä nimellä crond. Se toimii oikein hyvin, kun kone on aina päällä.

Jos kone ei ole aina päällä, kannattaa asentaa anacron. Sillä voi ajastaa komentoja vain päivien tarkkuudella, mutta se tallentaa tiedon siitä koska komento ajettiin, ja osaa ajaa väliin jääneet komennot sitten kun kone taas on ajossa. Lisätietoja saat komennolla man anacron.

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.

cron-komennolle ei ole vastaavia tiedostoja. 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.

Joitakin erikoisuuksia

Entä jos komento halutaan suorittaa nimenomaan perjantai 13. päivä? Se onnistuu esimerkiksi suorittamalla joka perjantai tällainen komento:

if (( $(date +%d) == 13 )); then mail -s 'arghs' oma@osoite.example; fi

Alle minuutin välein ei komentojen ajastaminen suoraan onnistu cronilla. Toisaalta cron-komennon ajama työ voi sisältää sleep-komennon. Esimerkiksi ping 30 sekunnin välein onnistuu ajamalla minuutin välein komento

ping -c 1 toinenkone.example ; sleep 30 ; ping -c 1 toinenkone.example

Kellonajan muutosta cron ja at eivät huomaa. Yleensä tällä ei ole merkitystä, mutta periaatteessa huomaamalla sopivaan aikaan kellon olevan jäljessä ja ajamalla date --set voi jokin ajastettu työ jäädä ajamatta.