Laske cron-lausekkeen seuraavat suoritukset

analysoi ja näyttää cron-konfiguraation seuraavat suoritusajat

Mikä on cron-lauseke?

Cron-lauseke on lyhyt merkkijono, joka kuvaa ajallista toistuvuutta. Unixista periytyvä muoto koostuu viidestä välilyönneillä erotetusta kentästä: minuutti, tunti, kuukauden päivä, kuukausi ja viikonpäivä. Tämä syntaksi syntyi Brian Kernighanin cron-demonin myötä 1970-luvulla, ja myöhemmin Vixie cron (1987) yleisti sen kaikkien nykyaikaisten Linux- ja macOS-jakeluiden käyttöön. Nykyään samaa syntaksia käytetään useimmissa pilviajastimissa (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) ja CI/CD-työkaluissa (GitHub Actions, GitLab CI, Jenkins).

┌──── minuutti (0-59)
│ ┌── tunti (0-23)
│ │ ┌── kuukauden päivä (1-31)
│ │ │ ┌── kuukausi (1-12 tai JAN-DEC)
│ │ │ │ ┌── viikonpäivä (0-7 tai SUN-SAT, 0 ja 7 = sunnuntai)
│ │ │ │ │
* * * * *

Oikein muodostettu cron-lauseke määrittelee tarkan cron-aikataulun: kukin kenttä voi olla kiinteä arvo, väli, luettelo, askel tai kaikki arvot kattava tähti. Crontab-lausekkeen tiiviys on sen vahvuus, mutta juuri siksi cron-dekooderi on välttämätön tarkoituksen visuaaliseen vahvistamiseen. Tämä on cron-muuntimen tarkoitus: tuottaa luettava selitys sekä luettelo seuraavista suorituskerroista.

Cron-lausekkeen anatomia

Viisi kenttää jakavat yhteisen kieliopin. Tässä ovat vakiomuotoisen crontab-lausekkeen kunkin sarakkeen hyväksymät rajat:

  • Minuutti: 0-59.
  • Tunti: 0-23, 24 tunnin muodossa.
  • Kuukauden päivä: 1-31.
  • Kuukausi: 1-12 tai tekstilyhenteet JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • Viikonpäivä: 0-7, joissa 0 ja 7 tarkoittavat molemmat sunnuntaita, tai lyhenteet SUN, MON, TUE, WED, THU, FRI, SAT.

Erikoismerkit, jotka jaetaan kaikkien viiden kentän kesken:

  • * : mikä tahansa arvo, vastaa kentän kaikkia sallittuja arvoja.
  • , : erillinen luettelo, esimerkiksi 1,15,30 minuuttikentässä.
  • - : sisältävä väli, esimerkiksi 9-17 työaikaa varten.
  • / : askel (step), esimerkiksi */15 = 15 yksikön välein, tai 0-30/5 = 5 minuutin välein 0 ja 30 välillä.

Erityiset erikoismerkit (Quartz-laajennukset) (Java, AWS EventBridge, Spring): kielioppi kasvaa 6 tai 7 kenttään, jolloin alussa on sekuntisareke (0-59) ja toisinaan lopussa vuosisarake (1970-2099). Quartz esittelee myös merkin ? (ei tiettyä arvoa, kuukauden päivän ja viikonpäivän erottamiseen), L (last: kuukauden viimeinen päivä, tai viimeinen perjantai merkinnällä 5L), W (lähin arkipäivä) ja # (kuukauden N:s viikonpäivä, esimerkiksi 2#3 kolmannelle maanantaille). Quartz-lauseke ei yleensä ole yhteensopiva UNIX-crontabin kanssa ja päinvastoin: tämä on suurin virhelähde, kun cron-lauseke kopioidaan alustalta toiselle.

# UNIX / Vixie cron (5 kenttää)
0 9 * * 1-5

# Quartz (6 kenttää sekunneilla)
0 0 9 ? * MON-FRI

# Quartz (7 kenttää vuodella)
0 0 9 ? * MON-FRI 2026

Miksi cron-lauseke kannattaa dekoodata?

Merkinnän 0 0 * * * lukeminen on nopeaa. Merkinnän */7 2-5 1,15 * 1-5 lukeminen on huomattavasti hitaampaa. Kun lauseke ei ole triviaalinen, väärintulkinnan riski kasvaa, ja cron-dekoodauksesta tulee osa katselmointiprosessia.

  • Tuotannon virheenkorjaus: ymmärtää, miksi tehtävä käynnistyi klo 03.17 eikä klo 03.00, tai tunnistaa päällekkäisyydet kahden tehtävän välillä.
  • Koodikatselmointi: varmistaa, että pull requestissa ehdotettu ajastin tekee juuri sen, mitä tekijä väittää, ilman tarvetta muistaa kunkin symbolin merkitystä.
  • Ajastimien auditointi: tarkistaa Linuxin cron jobit tiedostoissa /etc/crontab ja /etc/cron.d/, Jenkins-liipaisimet, Kubernetes CronJobin spec.schedule-määritykset, AWS EventBridgen säännöt ja GCP Cloud Schedulerin tehtävät.
  • Perityn koodin migraatio: ottaa haltuun dokumentoimaton historiallinen /etc/crontab ja kartoittaa tehtävät ennen infrastruktuurin muutosta.
  • Perehdytys: antaa uudelle kehittäjälle mahdollisuuden lukea crontabia ilman, että hänen tarvitsee opetella kaikkia erikoismerkkejä heti kerralla.

Miten cron-dekooderia käytetään

Ohjeet crontab-lausekkeen dekoodaamiseen työkalulla:

  1. Liitä cron-lausekkeesi syöttökenttään (5 välilyönneillä erotettua kenttää).
  2. Määritä laskettavien seuraavien suorituskertojen määrä.
  3. Napsauta muunna aloittaaksesi cron-dekoodauksen: työkalu palauttaa selkokielisen lauseen, joka selittää liipaisun, sekä päivämäärillä varustetun luettelon seuraavista suorituksista.
  4. Varmista visuaalisesti, että päivämäärät vastaavat tarkoitustasi (aika, päivä, taajuus).
  5. Kopioi tulos kopiointipainikkeella liittääksesi sen tikettiin, PR:ään tai tekniseen dokumentaatioon.

Työkalu ei tyydy vain syntaktiseen parsintaan: se tarjoaa luonnollisen kielen cron-selityksen, mikä tekee siitä sekä cron-dekooderin että aikataulun vahvistimen.

Klassisia esimerkkejä cron-lausekkeista

Alla olevat mallit kattavat suurimman osan tuotannossa kohdattavista cron-aikatauluista. Ne ovat kaikki päteviä Linuxin crontabissa, Kubernetes CronJobissa, GitHub Actionsissa ja useimmissa sovellustason ajastimissa.

Lauseke Selkokielinen kuvaus
* * * * * Joka minuutti
0 * * * * Tasatunnein
0 0 * * * Päivittäin keskiyöllä
0 0 * * 0 Joka sunnuntai keskiyöllä
*/15 * * * * 15 minuutin välein
0 9 * * 1-5 klo 9.00 maanantaista perjantaihin
0 0 1 * * Kuukauden 1. päivä keskiyöllä
0 0,12 * * * Keskiyöllä ja keskipäivällä joka päivä
*/5 9-17 * * 1-5 5 minuutin välein työaikana
30 2 1,15 * * Kuukauden 1. ja 15. päivä klo 2.30

Cron-tehtävän suorittamiseksi Linux-palvelimella muokataan käyttäjän crontabia komentoriviltä:

# muokkaa nykyisen käyttäjän crontabia
$ crontab -e

# listaa olemassa olevat tehtävät
$ crontab -l

# esimerkki lisätystä rivistä: päivittäinen varmuuskopiointi klo 3
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Esimerkki cron-muuntimen tulosteesta kohteelle */5 * * * * :

2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...

Usein kysyttyjä kysymyksiä cron-dekooderista

Mitä eroa on UNIX cronilla ja Quartzilla?

UNIX/Vixie cron käyttää viittä kenttää (minuutista viikonpäivään), ilman sekuntitarkkuutta, eikä siinä ole natiivia käsitettä « kuukauden viimeinen päivä ». Quartz (Java, Spring, AWS EventBridge) lisää sekuntisarakkeen alkuun, joskus vuosisarakkeen loppuun, ja useita symboleja (?, L, W, #), joita ei ole Linuxin crontabissa. Kuusikenttäinen Quartz-cron-lauseke ei siis ole suoraan siirrettävissä /etc/crontabiin ja päinvastoin. Meidän cron-dekooderimme kohdistuu viisikenttäiseen muotoon, joka kattaa useimmat ajoitusohjelmat.

Miten suoritetaan cron-tehtävä 5 minuutin välein?

Askeleella / minuuttikentässä:

*/5 * * * * /usr/local/bin/check-health.sh

Tämä crontab-lauseke käynnistää skriptin minuuteilla 0, 5, 10, 15... joka tunti, joka päivä. Rajoittaaksesi sen työaikoihin maanantaista perjantaihin, lisää rajoitukset tunti- ja viikonpäiväkenttiin: */5 9-17 * * 1-5.

Mitä tähti (*) tarkoittaa cron-lausekkeessa?

Tähti tarkoittaa mitä tahansa arvoa: se vastaa kaikkia kentän sallittuja arvoja. Lausekkeessa 0 0 * * * kolme tähteä tarkoittavat « mikä tahansa kuukauden päivä, mikä tahansa kuukausi, mikä tahansa viikonpäivä ». Yhdistettynä kahteen ensimmäiseen kenttään, jotka on asetettu arvoon 0, saadaan « joka päivä keskiyöllä ». Tähti voidaan myös yhdistää askeleeseen: */15 minuuttikentässä = 15 minuutin välein.

Onko crontabilla aikavyöhykettä?

Oletuksena palvelimen aikavyöhyke. Linuxin crontabissa se on järjestelmän aikavyöhyke (usein UTC VPS-palvelimilla ja konteissa). GitHub Actions pakottaa UTC:n. Kubernetes CronJob käyttää ohjaimen aikavyöhykettä, joka on konfiguroitavissa spec.timeZone-asetuksella versiosta 1.27 alkaen. AWS EventBridge arvioi lausekkeet UTC:nä. Sovellustason ajoittajat (Symfony Scheduler, Quartz, Airflow) sallivat usein erillisen aikavyöhykkeen asettamisen kullekin tehtävälle. Jos olet epävarma, tarkista date kohdepalvelimelta ja vertaa sitä cron-muuntimen tulosteeseen.

Cron-tehtävä vs at-komento: kumpi valita?

cron-tehtävää käytetään toistuvan tehtävän suorittamiseen aikataulun mukaisesti. at-komentoa käytetään komennon suorittamiseen vain kerran tiettynä ajankohtana. Käytä cronia päivittäisiin varmuuskopiointeihin, lokien rotaatioon tai säännöllisiin API-kutsuihin. Käytä at-komentoa kertaluonteiseen viivästettyyn operaatioon (« suorita tämä käyttöönotto klo 22 tänä iltana »):

$ echo "/usr/local/bin/deploy.sh" | at 22:00
Miten testata cron-lauseketta käynnistämättä sitä?

Tämä on juuri tämän cron-muuntimen tehtävä: se laskee seuraavat N suoritusta nykyhetkestä alkaen käynnistämättä mitään tehtävää. Näet heti, suoriutuuko crontab-lausekkeesi klo 03.00 suunnitellusti vai vahingossa klo 03.17. Ennen tehtävän asentamista voit also testata skriptiä yksinään (bash -x script.sh) ja tarkistaa crontab-tiedoston syntaksin komennolla crontab -T tiedosto sitä tukevissa jakeluissa.

Mitä tapahtuu, jos sekä kuukauden päivä että viikonpäivä on asetettu?

Vixie cronissa (Linux) sääntö on looginen TAI: tehtävä suoritetaan, jos jompikumpi kentistä täsmää. Tämä on epäintuitiivista ja altista virheille. Quartz käyttää JA-sääntöä, mistä johtuen on otettu käyttöön symboli ? ilmoittamaan nimenomaan « ei rajoitusta ». Yleissääntönä on asettaa vain toinen näistä kahdesta kentästä.

Pyyntöesimerkki

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Syöteskeema

Kenttä Tyyppi Pakollinen Oletus
cron string
number_next_date integer

Päätepisteet

  • GET https://cdrn.fr/api/v1/tools - listaa kaikki saatavilla olevat työkalut
  • GET https://cdrn.fr/api/v1/tools/cron-converter - hakee tämän työkalun skeeman
  • POST https://cdrn.fr/api/v1/tools/cron-converter/execute - suorittaa tämän työkalun JSON-payloadilla