Tarkibga o'tish

cron asoslari

Kimdir har kecha buyruq ishga tushirishni eslab qolishiga bog'liq server ertami-kechmi ishdan chiqadi. Chunki odamlar unutadi, ta’tilga chiqadi yoki log katalogi diskni to'ldirgan tungi soat 3 da uxlab yotgan bo'ladi. Linux bu muammoni cron bilan hal qiladi. cron — Unix oilasidagi tizimlarda 1970-yillardan beri buyruqlarni jadval bo'yicha ishga tushirib kelayotgan fon servisi. Vazifa (job) cron’da ro'yxatdan o'tkazilgach, hech kim tizimga kirmagan bo'lsa ham, u har safar aynan ko'rsatilgan vaqtda ishga tushadi.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • cron daemon nima ekanini va u vazifani qachon ishga tushirishni qanday hal qilishini tushuntirish;
  • crontab qatorida ishlatiladigan besh maydonli vaqt ko'rsatkichini o'qish va yozish;
  • har bir maydonda *, ro'yxatlar, oraliqlar va qadam qiymatlaridan (*/N) foydalanish;
  • @reboot, @daily va shunga o'xshash qisqartmalardan to'g'ri foydalanish;
  • oy kuni (day-of-month) va hafta kuni (day-of-week) bilan bog'liq klassik noaniqlikdan qochish;
  • ishga tushirish vaqtini tanlashda mahalliy vaqt zonasi va yozgi vaqtga o'tishni hisobga olish.

cron nima va u nega mavjud

cron — daemon, ya’ni tizim yuklanganda ishga tushadigan va boshqaruvchi terminalsiz fonda ishlab turadigan jarayon. U har daqiqada bir marta uyg'onadi, crontab deb ataladigan jadval fayllarini o'qiydi va joriy daqiqani ulardagi har bir qator bilan solishtiradi. Vaqt maydonlari joriy daqiqaga mos kelgan har qanday qatorning buyrug'i darhol, yangi shell’da bajariladi.

systemctl status cron
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled)
     Active: active (running) since Tue 2026-07-28 06:12:04 UTC; 1 day ago

Loaded: qatori unit fayl topilganini va u enabled ekanini (tizim yuklanganda ishga tushishini) ko'rsatadi. Haqiqatan muhim qator esa Active: active (running) — u daemon hozir ishlab turganini tasdiqlaydi. Agar cron ishdan chiqqan yoki umuman ishga tushirilmagan bo'lsa, bu qatorda Active: inactive (dead) yoki failed turadi. Bu holatda sudo systemctl start cron bilan qayta ishga tushirilmaguncha hostdagi birorta ham rejalashtirilgan vazifa ishlamaydi, va bu jimgina sodir bo'ladi. Faqat bitta qator noto'g'ri ishlayotgan emas, balki mashinadagi barcha vazifalar to'xtab qolgan bo'lsa, birinchi qadam — aynan shu qatorni tekshirish.

Distributivlardagi nomlanish

Debian va Ubuntu’da paket va servis cron deb ataladi. RHEL oilasida (RHEL, CentOS, Rocky, Alma) xuddi shu vazifani crond bajaradi, shuning uchun u yerda mos buyruq systemctl status crond. Ikkalasi ham bir xil crontab formatidan foydalanadi, faqat servis nomi va ba’zi paketlash tafsilotlari farq qiladi. Bu crontab va tizim cron’i maqolasida batafsilroq ko'rib chiqiladi.

cron qo'lda chaqiriladigan narsa emas, balki doimiy ishlaydigan daemon. Shuning uchun u orqali rejalashtirilgan vazifa hech kim tizimga kirmagan paytda ham, hatto bir necha soat oldin yopilgan SSH sessiyadan keyin ham ishlashda davom etadi. Aynan shu xususiyat uni inson ishtirokisiz bajariladigan texnik xizmat uchun yaroqli qiladi: log rotation, ma’lumotlar bazasi dump’lari, sertifikat yangilanishini tekshirish va healthcheck skriptlari — hammasi unga tayanadi.

Crontab qatori: besh maydon, keyin buyruq

Crontab’dagi izoh bo'lmagan va bo'sh bo'lmagan har bir qator bir xil ko'rinishga ega:

minute hour day-of-month month day-of-week command
Maydon Ruxsat etilgan qiymatlar Ma’nosi
minute 0–59 Soatning daqiqasi
hour 0–23 Kunning soati, 24 soatlik format
day-of-month 1–31 Kalendar oyining kuni
month 1–12 Oy raqami
day-of-week 0–7 Hafta kuni; 0 ham, 7 ham yakshanbani bildiradi, 1 — dushanba

Vazifa faqat beshala maydon joriy sana va vaqtga mos kelgan daqiqada ishga tushadi. Yil uchun maydon yo'q, shuning uchun bugunga mos kelgan qator olib tashlanmaguncha har yili mos kelaveradi.

0 7 * * 1 /opt/sales/bin/weekly-report

Buni chapdan o'ngga o'qiymiz: 0-daqiqa, 7-soat, oyning istalgan kuni, istalgan oy, haftaning 1-kuni (dushanba). Vazifa har dushanba soat 07:00 da ishga tushadi. day-of-month va month maydonlaridagi ikkita yulduzcha "bu maydon bo'yicha cheklov yo'q" degani: vazifa ma’lum bir kalendar sanasiga emas, hafta kuniga bog'langan.

Wildcard’lar, ro'yxatlar, oraliqlar va qadamlar

Yolg'iz * maydonning barcha mumkin bo'lgan qiymatlariga mos keladi. Bundan tashqari, cron istalgan maydonda yana uchta konstruksiyani qabul qiladi:

  • Ro'yxat — vergul bilan ajratilgan qiymatlar: minute maydonidagi 0,30 "0-daqiqada va 30-daqiqada" degani.
  • Oraliq — ikki qiymat orasidagi chiziqcha: minute maydonidagi 0-4 "0, 1, 2, 3 va 4-daqiqalarda" degani.
  • Qadam — oraliq yoki * dan keyingi slash: minute maydonidagi */15 "0 dan boshlab har 15 daqiqada", ya’ni 0, 15, 30, 45 degani.
*/2 * * * * /usr/local/bin/heartbeat.sh
0-4 * * * * /usr/local/bin/burst-check.sh
15,45 * * * * /usr/local/bin/twice-hourly.sh

Birinchi qator kecha-kunduz har 2 daqiqada ishga tushadi. Ikkinchisi har soatning dastlabki besh daqiqasida daqiqasiga bir marta ishga tushadi. Bu besh daqiqa davom etadigan bitta vazifa emas, balki beshta alohida ishga tushirish, chunki cron faqat vazifani boshlaydi va u qancha davom etishini hech qachon kuzatmaydi. Uchinchisi soatiga ikki marta, 15 va 45-daqiqalarda ishga tushadi.

Intervyuda: cron’ning aniqlik darajasi

cron’ning eng kichik aniqligi — bir daqiqa. Faqat cron yordamida biror narsani har 10 soniyada rejalashtirishning iloji yo'q. Agar healthcheck’ni har 10 soniyada qanday ishga tushirish so'ralsa, halol javob shunday: cron bu ish uchun noto'g'ri vosita. systemd servisi ichidagi kichik while sikli yoki OnUnitActiveSec=10s bilan sozlangan systemd timer ancha mos keladi (qarang: systemd timer’lar: cron’ga muqobil).

day-of-month / day-of-week tuzog'i

"Qaysi kun"ni ikkita maydon tavsiflaydi. Ikkalasi bir vaqtda cheklanganda, keng tarqalgan cron implementatsiyalari — jumladan Debian’dagi cron va RHEL’dagi Vixie’dan kelib chiqqan crond — ularni AND bilan emas, OR bilan birlashtiradi:

0 9 1 * 1 /usr/local/bin/monthly-and-monday-report.sh

Yangi boshlovchi buni "oyning 1-kuni, agar u dushanbaga to'g'ri kelsa" deb o'qiydi. Lekin cron uni oyning 1-kunida yoki dushanba kuni — qaysi biri oldin kelsa — ishga tushiradi. crontab sintaksisining boshqa hech bir qismi bu xatti-harakatchalik ko'p kutilmagan ortiqcha ishga tushirishlarga sabab bo'lmaydi. Agar vazifa haqiqatan "oyning 1-kuni, faqat dushanbaga to'g'ri kelsa" ishlashi kerak bo'lsa, ishonchli yechim — ikki maydondan birini * qilib qoldirish va qo'shimcha shartni skriptning o'zida tekshirish (masalan, date +%u bilan). crontab sintaksisi AND ni ifodalaydi, deb kutmang.

Qisqartma satrlar

Vixie-cron uslubidagi implementatsiyalar, jumladan Debian, Ubuntu va RHEL bilan birga keladiganlari, besh vaqt maydoni o'rniga @ bilan boshlanadigan bir nechta qisqartmani qabul qiladi:

Qisqartma Ekvivalenti Ma’nosi
@reboot — Daemon ishga tushganda bir marta ishlaydi
@yearly / @annually 0 0 1 1 * Yiliga bir marta, 1-yanvar yarim tunida
@monthly 0 0 1 * * Oyiga bir marta, oyning 1-kuni yarim tunida
@weekly 0 0 * * 0 Haftasiga bir marta, yakshanba yarim tunida
@daily / @midnight 0 0 * * * Kuniga bir marta, yarim tunda
@hourly 0 * * * * Soatiga bir marta, 0-daqiqada
@reboot /usr/local/bin/mount-data-volume.sh
@daily /usr/local/bin/rotate-app-logs.sh

@reboot — besh maydonli ekvivalenti yo'q yagona qisqartma. U cron daemon’ining o'zi ishga tushganda bir marta ishlaydi, amalda bu har bir tizim yuklanishida bir marta degani. U odatda ishga tushgandan keyin aynan bir marta bajarilishi kerak bo'lgan vazifalar uchun ishlatiladi: qo'shimcha volume’ni mount qilish, keshni isitish yoki systemd bevosita boshqarmaydigan yordamchi jarayonni ishga tushirish.

Qisqartmalar — kafolat emas, kelishuv

@reboot va boshqa qisqartmalar Debian, Ubuntu va RHEL’dagi keng tarqalgan cron implementatsiyalarida qo'llab-quvvatlanadi. Lekin man sahifada ta’kidlanganidek, qo'llab-quvvatlash implementatsiyaga qarab farq qilishi mumkin. Turli distributivlarda ishlashi kerak bo'lgan skriptda qisqartmaga tayanishdan oldin maqsadli tizimda man 5 crontab ni ishga tushirib ko'ring.

Vaqt zonalari va yozgi vaqt

cron har bir jadvalni UTC bo'yicha emas, tizimning mahalliy vaqt zonasi bo'yicha hisoblaydi (agar mashina soatining o'zi UTC’ga o'rnatilgan bo'lmasa). Jadvalga ishonishdan oldin host qaysi zonadan foydalanayotganini tasdiqlab olgan ma’qul:

timedatectl | grep 'Time zone'
                Time zone: Europe/London (BST, +0100)

Buning ikki oqibati intervyuda ham, production’da ham odamlarni chalg'itadi:

  • Host zonasini o'zgartirish barcha vazifalarni jimgina siljitadi. 0 3 * * * qatori "mahalliy vaqt bilan soat 3" degani. Serverni boshqa mintaqaga ko'chirsangiz yoki uning zonasini timedatectl set-timezone bilan o'zgartirsangiz, o'sha qator endi yangi zona bo'yicha soat 3 da ishlaydi. Bir nechta mintaqani qamrab olgan serverlar parkida eng xavfsiz kelishuv — serverlarni UTC da saqlash. Shunda bitta jadval hamma joyda bir xil vaqt lahzasini bildiradi.
  • Yozgi vaqtga o'tish erta tongdagi oraliqni buzadi. Soat oldinga surilganda (masalan, 01:59 → 03:00) bir soatlik vaqt umuman sodir bo'lmaydi; orqaga surilganda esa bir soat ikki marta takrorlanadi. Muayyan cron implementatsiyasi shu oraliqqa rejalashtirilgan aniq soatli vazifani qanday qayta ishlashi — o'tkazib yuboradimi, bir marta yoki ikki marta ishga tushiradimi — farq qiladi. Shuning uchun hamma joyda ishlaydigan qoida oddiy: aniq vaqtli vazifalarni 01:00 va 03:00 orasiga rejalashtirmang. Aniq soat o'rniga qadam (*/30) bilan yozilgan vazifalar yo'qolib ketgan biror daqiqaga bog'lanmagan, shuning uchun ularga bu ta’sir qilmaydi.

Amaliy vaziyat: to'g'ri jadvalni tanlash

Muammo. Ilova /var/log/myapp/ ga batafsil debug log'larini yozadi va hech narsa tozalamasa, partition taxminan haftada bir marta to'lib qoladi. 7 kundan eski log'larni o'chiradigan va tinch soatda ishlaydigan vazifa kerak.

Joriy disk bandligini tekshirish:

du -sh /var/log/myapp/
2.3G    /var/log/myapp/

Jadvalni loyihalash. Faqat 7 kunlik saqlash muddatiga yetib olishi kerak bo'lgan vazifa uchun oyning har kuni, trafik eng kam bo'lgan soatda (03:00) kuniga bir marta ishga tushish yetarli:

0 3 * * * find /var/log/myapp/ -name '*.log' -mtime +7 -delete

Natija. Navbatdagi rejalashtirilgan ishga tushirishdan keyin tekshiring:

find /var/log/myapp/ -name '*.log' -mtime +7

Bo'sh natija 7 kundan eski hech narsa qolmaganini tasdiqlaydi. Bu qatorni amalda qanday ro'yxatdan o'tkazish — crontab -e yoki tizim darajasidagi fayl — keyingi maqolada, crontab va tizim cron’i da ko'rib chiqiladi.

Xulosa. Vaqt maydonlari vazifa qachon ishlashini tavsiflaydi, daemon esa u inson ishtirokisiz albatta ishlashini kafolatlaydi. Jadvalni boshidanoq to'g'ri tuzish va day-of-month bilan day-of-week’ni aniq ajratish keyinchalik kutilmagan ishga tushirishlarning oldini oladi.

Keng tarqalgan xatolar

  • day-of-month va day-of-week AND bilan birlashadi, deb o'ylash. Ikkalasi ham cheklangan bo'lsa, ular OR bilan birlashadi; yuqoridagi alohida bo'limga qarang.
  • * o'rniga */1 yozish. minute maydonida ikkalasi ham "har daqiqada" degani, lekin */1 buni yozishning keraksiz chalkash usuli. Qadam 1 dan katta bo'lmasa, oddiy * dan foydalaning.
  • Yil maydoni yo'qligini unutish. Besh maydonli qator bilan rejalashtirilgan bir martalik vazifa keyin qo'lda olib tashlanmasa, har yili ishga tushaveradi.
  • Jadvalni sinamasdan unga ishonish. Oraliq yoki vergulni noto'g'ri o'qish oson. Keyingi bir nechta ishga tushish vaqtini qo'lda tekshirib chiqing yoki haqiqiy jadvalni belgilashdan oldin buyruqning o'zi ishlashini tasdiqlash uchun vazifani vaqtincha qoralama faylda * * * * * qilib qo'ying.

Mashqlar

  1. /usr/local/bin/sync.sh ni kecha-kunduz har 10 daqiqada ishga tushiradigan crontab qatorini yozing. Javobingizni u bir soat ichida ishga tushadigan oltita daqiqa qiymatini sanab chiqib tekshiring.
  2. Hamkasbingiz vazifa "tungi soat 2:30 da, lekin faqat ish kunlari" ishlashini xohlaydi. Qatorni yozing va "ish kunlari" qaysi maydonda ifodalanishini hamda u qanday qiymatlardan foydalanishini ayting.
  3. 30 6 15 * 3 /usr/local/bin/job.sh nega day-of-month/day-of-week qoidasini bilmaydigan odam kutganidan ko'ra tez-tez ishga tushishini o'z so'zlaringiz bilan tushuntiring. Ikkala kun maydonining alohida qiymatlarini o'zgartirmasdan yechimni tavsiflang.

Xulosa

cron — buyruqlarni jadval bo'yicha ishga tushiradigan, tizim yuklanganda avtomatik ishga tushadigan va besh maydonli crontab formatiga amal qiladigan daemon. Bu maqola faqat vaqt sintaksisini ko'rib chiqdi. Jadvalni amalda o'rnatish hamda foydalanuvchining shaxsiy crontab’i va tizim darajasidagi crontab o'rtasidagi farq crontab va tizim cron’i maqolasida davom etadi.

Manbalar