Mi az a cron-kifejezés?
A cron-kifejezés egy tömör ütemező sztring, amely pontosan megmondja egy feladatütemezőnek, hogy mikor kell elindítania egy feladatot. A formátum 1975-ben született a Unix V7 cron démonában, és azóta alig változott — ugyanaz az ötmezős nyelvtan jelenik meg ma a Kubernetes CronJob-okban, az AWS EventBridge-ben, a GitHub Actions munkafolyamatokban, a Google Cloud Schedulerben, a GitLab CI-ben, a Jenkins pipeline-okban és a crontab binárisban, amelyet minden Linux-disztribúció tartalmaz. A nyelvtan rengeteg jelentést sűrít körülbelül tizenhárom karakterbe, ezért egy elemző, amely átalakítja azt közérthető magyarázatra, a különbség a magabiztos telepítés és a hajnali 3-as visszaállítás között.
Hogyan működik a cron-kifejezés?
Egy szabványos cron-kifejezés öt szóközzel elválasztott mezőből áll, amelyek együtt egy ismétlődő ütemezést határoznak meg. A motor percenként ellenőrzi a pontos aktuális időt a kifejezés ellen, és elindítja a feladatot, ha mind az öt mező egyezik. A mezők balról jobbra:
- Perc (0–59). Az órán belül melyik percben indul a feladat. A
0azt jelenti, hogy egész órakor, a30azt, hogy fél órakor, a*/5azt, hogy ötpercenként (00, 05, 10, ...), a15,45pedig azt, hogy negyedkor és háromnegyedkor. - Óra (0–23). A nap melyik órájában a 24 órás óra szerint. A
0éjfél, a9reggel 9, a17délután 5. A tartományok (9-17a munkaidőre) és a lépésértékek (*/2minden második órában) ugyanúgy működnek, mint a perceknél. - Hónap napja (1–31). Melyik naptári napon fusson. A
1a hónap 1. napját jelenti, a*minden napot, a1,15az 1. és a 15. napot. Legyen óvatos a31-gyel — csendben átugorja azokat a hónapokat, amelyeknek nincs 31. napjuk. - Hónap (1–12 vagy JAN–DEC). Melyik hónapokban fusson. A
*minden hónapot jelent, a1,7a januárt és a júliust, a1-3csak az első negyedévet. A hárombetűs hónapnevek a legtöbb implementációban nem érzékenyek a kis- és nagybetűkre. - Hét napja (0–7, ahol a 0 és a 7 is vasárnapot jelent). Korlátozza az indítást bizonyos hét napjaira. Az
1-5hétfőtől péntekig, a0,6a hétvége, aMON-FRIa legtöbb elemzőben működik. Ha a hónap napja és a hét napja is egyedi értékre van állítva, a klasszikus cron mindkettő egyezésekor elindítja a feladatot (logikai VAGY), ami minden alkalommal meglepi az embereket.
Miért használjunk cron-kifejezés elemzőt?
- Fogja meg a csendes félreértést a telepítés előtt. A `0 2 */3 * *` kifejezés hajnali 2-kor indul minden harmadik napon, nem pedig hárompercenként — illessze be ide, és ezt közérthető magyarázatként látni fogja, mielőtt éles környezetbe kerülne.
- A legtöbb felhőalapú ütemező alapértelmezés szerint UTC-ben fut. Ha előnézetben megtekinti a következő tíz futási időt a helyi időzónájában, azonnal észreveszi az egyórás nyári időszámítás eltérést, mielőtt az hajnali 3-kor riasztana valakit.
- Az olyan rövidítések, mint a
@daily, a@weeklyés a@monthly, kényelmesek, de félreérthetőek. Az elemző megmutatja a mögöttes ötmezős formát, így pontosan tudja, mi lett ütemezve. - A mezőnkénti építő lehetővé teszi, hogy egy ütemezést egyszerre egy oszlopban állítson össze, miközben élőben figyeli az emberi leírás frissülését, ami sokkal gyorsabb, mint tizedikszerre is elolvasni a cron kézikönyvoldalát.
Hol használnak cron-kifejezéseket?
A cron szintaxis bárhol felbukkan, ahol egy feladatnak időzítés szerint kell ismétlődnie. Három a leggyakoribb felület a pontosan azzal a buktatóval, amelyről mindegyik híres:
- Biztonsági mentési ütemezések. A klasszikus
crontab -ebejegyzés, amely éjszakánként 2:00-kor dumpolja az adatbázist az S3-ba, vagy havonta az 1-jén forgatja apg_dumparchívumot. Egy olyan sor, mint0 2 * * * /usr/local/bin/backup.sh, több Linux szerveren futott már, mint bármely más cron sor a történelemben. Ha jól állította be a percet és az órát, és a stderr-t valami tartós helyre irányította, akkor egy manuális ellenőrzőlistát cserélt le egy tűz-és-felejts parancsfájlra. - GitHub Actions
scheduletriggerek. Aon.schedule.cronkulcs a `.github/workflows/*.yml` fájlban elfogadja a szabványos ötmezős cron-t, de a feladat mindig UTC-ben fut, és a GitHub csendben kihagy egy ütemezett időpontot, ha a futó sor zsúfolt. Gyakori minta:cron: '0 9 * * 1-5'hogy hétfőtől péntekig minden nap 9:00 UTC-kor küldjön egy összefoglalót. Tekintse meg először itt a helyi időzónájában, hogy ne ígérjen egy 9:00-as londoni összefoglalót, ami valójában 10:00-kor (BST) érkezik. - AWS EventBridge Scheduler. Az EventBridge cron-kifejezések hatodik mezőt vesznek fel az évhez, és
?-t követelnek a*helyett vagy a hónap napja, vagy a hét napja mezőben — acron(0 9 ? * MON-FRI *)az EventBridge változata a klasszikus hétköznap 9:00-as cron-nak. Ütemezett Lambda-hívásokhoz, ECS-feladatfuttatásokhoz és Step Function állapotgép-indításokhoz használják; a klasszikus cron szintaxissal való eltérés aValidationExceptionhibák első számú forrása a CloudFormation telepítésekben.
Hogyan néz ki egy valódi cron-kifejezés?
Vegyük a 0 9 * * 1-5-öt — minden hétköznap 9:00-kor indul. A mezők balról jobbra olvasva: 0 a nulla perc az órában, 9 a 9 óra a 24 órás óra szerint, * a hónap napjánál minden naptári napot jelent, * a hónapnál minden hónapot, 1-5 a hét napjánál pedig hétfőtől péntekig korlátozza az indítást (ahol 1 = hétfő a szabványos cron számozásban). Illessze be a fenti bemenetbe, és az elemző megerősíti 09:00-kor, hétfőtől péntekig és a következő tíz ütemezett dátumot megjeleníti a kiválasztott IANA időzónában. Ugyanez a szándék az AWS EventBridge szintaxisában cron(0 9 ? * MON-FRI *) — figyelje meg az év mezőt a végén és a ?-t ahol a szabványos cron *-t használna. Ugyanez a szándék Quartz-kifejezésként (hatmezős vezető másodpercekkel) 0 0 9 ? * MON-FRI. Három különböző platform, három különböző felszíni forma, egy mögöttes ütemezés.
A cron-kifejezések pontosan egyféleképpen könyörtelenek: egy elgépelés szintaktikailag érvényes ütemezést ad, amely rosszkor indul, és a kódellenőrzés során nem kap rá hibát. A `0 0 1 * *` olvasása és annak tudása, hogy minden hónap 1-jén éjfélkor fut, nem pedig január 1-jén, gyakorlást igényel. A fenti elemző ezt a gyakorlatot egy tíz másodperces ellenőrzéssé változtatja — illessze be a kifejezést, olvassa el a magyarázatot, nézze át a következő tíz futási időt a helyi időzónájában, és küldje el a YAML-t abban a tudatban, hogy a cron sor valóban azt csinálja, amit a commit üzenet mond.
Mi a különbség az 5-mezős és a 6-mezős cron között?
Az ötmezős cron a klasszikus Unix nyelvtan egyperces felbontással. A hatmezős cron egy vezető másodperc oszlopot ad hozzá a percen belüli ütemezéshez — ezt használja a Quartz és a Spring @Scheduled annotációja. Az AWS EventBridge szintén hat mezőt használ, de az extra oszlopa a végén lévő év, nem a másodperc.
Mit jelentenek a @hourly, @daily és @weekly?
Vixie-cron becenevek 1987-ből. @hourly = 0 * * * *, @daily = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. A @reboot egyszer indul a rendszerindításkor. A GitHub Actions és az EventBridge elutasítja ezeket az aliasokat.
A vasárnap 0. vagy 7. nap a cron-ban?
Mindkettő, a klasszikus Vixie cron-ban — a 0 és a 7 is elfogadott, így az olyan tartományok, mint 5-7, természetesen olvashatók péntektől vasárnapig. A hétfő mindig 1, a szombat mindig 6. A Quartz és az AWS EventBridge más konvenciót használ: 1-7 a vasárnappal mint 1. Ellenőrizze a platform dokumentációját, mielőtt feltételezéseket tenne.
Hogyan kezeli a cron a nyári időszámítást?
A motor időzónájától függ. UTC-ben (alapértelmezett az EventBridge-ben, a Kubernetes-ben és a GitHub Actions-ben) a nyári időszámítás nem létezik. Helyi nyári időszámítású zónában a klasszikus Vixie cron kihagyja a feladatokat a tavaszi előreugráskor, és kétszer futtatja őket az őszi visszaálláskor; a systemd időzítők pontosan egyszer indulnak el.