Msemi wa cron ni nini?
Msemi wa cron ni mfuatano wa kupanga ratiba uliofupishwa ambao huambia mwendeshaji wa kazi hasa lini kufyatua kazi. Muundo ulizaliwa mwaka 1975 ndani ya mnyama wa cron wa Unix V7 na umebadilika kidogo tangu wakati huo — sarufi ile ile ya mashamba matano inaonekana leo katika Kubernetes CronJobs, AWS EventBridge, mtiririko wa GitHub Actions, Google Cloud Scheduler, GitLab CI, mifumo ya Jenkins, na faili la crontab bado linalowasilishwa na kila usambazaji wa Linux. Sarufi inabeba maana nyingi katika herufi kama kumi na tatu, ndiyo maana mchakato ambao unaibadilisha kuwa Kiingereza cha kawaida ndio tofauti kati ya kuwasilisha kwa ujasiri na kurudisha nyuma saa 3 asubuhi.
Msemi wa cron unafanya kazi vipi?
Msemi wa kawaida wa cron una mashamba matano yaliyotenganishwa na nafasi ambayo kwa pamoja yanafafanua ratiba inayojirudia. Injini inakagua saa ya ukuta wa sasa dhidi ya msemi kila dakika na kufyatua kazi wakati mashamba yote matano yanafanana. Mashamba, kutoka kushoto kwenda kulia:
- Dakika (0–59). Ni dakika gani ndani ya saa kazi inayofanyika.
0inamaanisha kwenye saa,30inamaanisha katikati ya saa,*/5inamaanisha kila dakika tano (00, 05, 10, ...), na15,45inamaanisha robo baada ya na robo kabla. - Saa (0–23). Ni saa gani ya siku kwenye saa ya masaa 24.
0ni usiku wa manane,9ni saa 9 asubuhi,17ni saa 5 jioni. Safu (9-17kwa saa za biashara) na thamani za hatua (*/2kwa kila saa mbili) zinafanya kazi sawa na kwa dakika. - Siku ya mwezi (1–31). Ni siku gani ya kalenda ya kufanya kazi.
1inamaanisha tarehe 1 ya mwezi,*inamaanisha kila siku,1,15inamaanisha tarehe 1 na 15. Kuwa makini na31— inaacha kimya miezi ambayo haina siku 31. - Mwezi (1–12 au JAN–DEC). Ni miezi gani ya kufanya kazi.
*inamaanisha kila mwezi,1,7inamaanisha Januari na Julai,1-3inamaanisha robo ya kwanza tu. Majina ya miezi ya herufi tatu hayazingati herufi kubwa au ndogo katika utekelezaji mwingi. - Siku ya wiki (0–7, ambapo 0 na 7 vyote vinamaanisha Jumapili). Inazuia kufyatua hadi siku maalum za wiki.
1-5ni Jumatatu hadi Ijumaa,0,6ni wikendi,MON-FRIinafanya kazi katika wachakato wengi. Siku ya mwezi na siku ya wiki zikiwekwa zote kwa thamani maalum, cron ya kawaida hufyatua kwa mechi yoyote (OR ya kimantiki), ambayo inashangaza watu kila wakati.
Kwa nini kutumia mchakato wa msemi wa cron?
- Shika usomaji mbaya kimya kabla ya kuwasilisha. Msemi `0 2 */3 * *` hufyatua saa 2 asubuhi kila siku ya tatu, si kila dakika tatu — ibandike hapa na utaona hiyo kwa Kiswahili cha kawaida kabla haijatumwa kwenye uzalishaji.
- Wapanga ratiba wengi wa wingu wanafanya kazi kwa UTC kwa chaguo msingi. Kuangalia nyakati kumi za moto zinazofuata katika eneo lako la ndani huonyesha kutofautiana kwa saa moja kutokana na DST kabla ya kupiga simu mtu saa 3 asubuhi.
- Njia za mkato kama `@daily`, `@weekly`, na `@monthly` ni rahisi lakini hazifahamiki. Mchakato unakuonyesha muundo wa msingi wa mashamba matano ili ujue hasa nini kilipangwa ratiba.
- Kijenzi cha uwanja kwa uwanja kinakuruhusu kutunga ratiba safu moja kwa wakati mmoja na kutazama maelezo ya binadamu yakisasishwa moja kwa moja, ambayo ni haraka zaidi kuliko kusoma kurasa ya man ya cron mara ya kumi.
Misemi ya cron inatumika wapi?
Sintaksia ya cron inaonekana mahali popote ambapo kazi inahitaji kujirudia kwenye saa. Miongoni mwa maeneo ya kawaida zaidi, na tatizo halisi ambalo kila moja inajulikana nalo:
- Ratiba za kuakiba. Ingizo la kawaida la `crontab -e` ambalo huhifadhi hifadhidata kwenye S3 saa 2 asubuhi kila usiku, au kuzungusha akiba ya `pg_dump` tarehe 1 ya kila mwezi. Mstari kama `0 2 * * * /usr/local/bin/backup.sh` umetumwa kwenye seva nyingi za Linux zaidi ya mstari wowote mwingine wa cron katika historia. Pata dakika na saa sawa, elekeza stderr mahali padumu, na umebadilisha orodha ya mkono na hati ya kufyatua-na-kusahau.
- Mifumo ya `schedule` ya GitHub Actions. Funguo ya `on.schedule.cron` katika `.github/workflows/*.yml` inakubali cron ya kawaida ya mashamba matano, lakini kazi daima inafanyika kwa UTC na GitHub itaacha kimya wakati wa moto ikiwa foleni ya mkimbiaji ina shughuli. Mchoro wa kawaida: `cron: '0 9 * * 1-5'` kutuma muhtasari wa Jumatatu hadi Ijumaa saa 9 asubuhi UTC. Uiangalie hapa kwanza katika eneo lako la ndani ili usitoe ahadi ya muhtasari wa saa 9 asubuhi London ambao kwa kweli unafika saa 10 asubuhi kwa BST.
- AWS EventBridge Scheduler. Misemi ya cron ya EventBridge huchukua uwanja wa sita kwa mwaka na kudai `?` badala ya `*` katika uwanja wa siku-ya-mwezi au siku-ya-wiki — `cron(0 9 ? * MON-FRI *)` ni tafsiri ya EventBridge ya cron ya kawaida ya Jumatatu-hadi-Ijumaa saa 9 asubuhi. Inatumika kwa miitisho ya Lambda iliyopangwa, uendeshaji wa kazi za ECS, na uanzishaji wa mashine za hali za Step Function; kutofanana na sintaksia ya cron ya kawaida ndio chanzo namba moja cha makosa ya `ValidationException` katika usambazaji wa CloudFormation.
Msemi halisi wa cron unakaa vipi?
Chukua 0 9 * * 1-5 — hufyatua saa 9:00 asubuhi, kila siku ya wiki. Kusoma mashamba kutoka kushoto kwenda kulia: 0 ni dakika ya sifuri ya saa, 9 ni saa 9 asubuhi kwenye saa ya masaa 24, * kwenye siku-ya-mwezi inamaanisha kila siku ya kalenda, * kwenye mwezi inamaanisha kila mwezi, na 1-5 kwenye siku-ya-wiki inazuia kufyatua kwa Jumatatu hadi Ijumaa (ambapo 1 = Jumatatu katika nambari ya cron ya kawaida). Ibandike kwenye ingizo hapo juu na mchakato unathibitisha Saa 09:00 asubuhi, Jumatatu hadi Ijumaa na tarehe kumi za moto zinazofuata zinaonyeshwa katika eneo lolote la IANA unalochagua. Nia ile ile katika sintaksia ya AWS EventBridge ni cron(0 9 ? * MON-FRI *) — angalia uwanja wa mwaka mwishoni na ? ambapo cron ya kawaida ingetumia *. Nia ile ile kama msemi wa Quartz (mashamba sita na sekunde za kuongoza) ni 0 0 9 ? * MON-FRI. Majukwaa matatu tofauti, miundo mitatu tofauti ya uso, ratiba moja ya msingi.
Misemi ya cron haisamehi kwa njia moja hasa: kosa la herufi linakupa ratiba sahihi kisintaksia ambayo hufyatua wakati mbaya, bila hitilafu ya kushika katika ukaguzi wa msimbo. Kusoma `0 0 1 * *` na kujua inafanya kazi usiku wa manane tarehe 1 ya kila mwezi, si Januari 1, kunahitaji mazoezi. Mchakato hapo juu unabadilisha mazoezi hayo kuwa ukaguzi wa afya wa sekunde kumi — ibandike msemi, soma Kiswahili, angalia nyakati kumi za moto zinazofuata katika eneo lako la ndani, na wasilisha YAML ukijua mstari wa cron kwa kweli unafanya kile ujumbe wa utuma unasema unafanya.
Ni tofauti gani kati ya cron ya mashamba 5 na 6?
Cron ya mashamba matano ni sarufi ya kawaida ya Unix yenye azimio la dakika moja. Cron ya mashamba sita inaongeza safu ya sekunde za kuongoza kwa kupanga chini ya dakika — inayotumika na Quartz na `@Scheduled` ya Spring. AWS EventBridge pia inatumia mashamba sita, lakini safu yake ya ziada ni mwaka wa mwisho, si sekunde.
@hourly, @daily, na @weekly zinamaanisha nini?
Majina ya utani ya Vixie-cron yaliyoanzishwa mwaka 1987. @hourly = 0 * * * *, @daily = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. @reboot hufyatua mara moja wakati wa kuanza upya. GitHub Actions na EventBridge zinakataa majina haya ya mkato.
Je, Jumapili ni siku 0 au siku 7 katika cron?
Zote, katika Vixie cron ya kawaida — 0 na 7 vinakubaliwa ili safu kama 5-7 zisomeke kwa asili kama Ijumaa-hadi-Jumapili. Jumatatu daima ni 1, Jumamosi daima ni 6. Quartz na AWS EventBridge hutumia mkataba tofauti: 1-7 na Jumapili kama 1. Angalia nyaraka za jukwaa kabla ya kudhani.
Cron inashughulikia muda wa mchana kwa namna gani?
Inategemea eneo la wakati la injini. Kwa UTC (chaguo msingi kwenye EventBridge, Kubernetes, na GitHub Actions) DST haipo. Katika eneo la ndani la DST, Vixie cron ya kawaida huacha kazi wakati wa pengo la spring-forward na kuzifanya mara mbili wakati wa fall-back; vipima wakati vya systemd hufyatua mara moja hasa.