Skip to content

systemd timer: cron'ga zamonaviy muqobil

cron asoslari va crontab va system cron maqolalarida ko'rilgan cron — o'nlab yillardan buyon ishlatilib kelinayotgan, sodda va ishonchli vosita. systemd allaqachon PID 1 sifatida ishlab turgan tizimlarda esa muqobil bor: systemd timer. U cron bilan bir xil vazifani — vaqt bo'yicha buyruq ishga tushirish — bajaradi, lekin systemd unit sifatida journalctl, dependency va resource nazorati bilan integratsiyalashgan.

Bu maqola cron'ga alternativ sifatida yoziladi — cron'ni "noto'g'ri" deb ko'rsatish uchun emas, balki ikkisi orasidagi amaliy farqni va qachon qaysi birini tanlashni ko'rsatish uchun.

O'quv maqsadlari

Maqolani tugatgach:

  • systemd timer'ning ikkita fayldan (.service + .timer) iboratligini tushunasiz;
  • OnCalendar= bilan cron ifodasiga o'xshash jadval yarata olasiz;
  • yangi timer'ni yoqish, holatini va keyingi ishga tushish vaqtini tekshira olasiz;
  • timer natijasini journalctl orqali ko'ra olasiz;
  • cron va systemd timer orasida qachon qaysi birini tanlashni biladigan bo'lasiz.

Ikkita fayldan iborat tuzilma

Cron'da bitta qatorda jadval va buyruq birga yoziladi. systemd timer esa ikkita alohida unit fayldan iborat:

mytask.service   — nima bajarilishi kerak
mytask.timer     — qachon bajarilishi kerak

Bu ajratish afzalligi: mytask.serviceni istalgan vaqtda, jadvaldan mustaqil ravishda qo'lda ham ishga tushirish mumkin (systemctl start mytask.service) — sinov yoki qo'lda qayta ishga tushirish uchun qulay.

Namuna: har kuni log tozalash

1. Service faylini yaratish

sudo nano /etc/systemd/system/log-cleanup.service
[Unit]
Description=Eski loglarni tozalash

[Service]
Type=oneshot
ExecStart=/usr/local/bin/log-cleanup.sh

Type=oneshot — bu unit doimiy ishlab turadigan xizmat emas, bir marta ishga tushib tugaydigan vazifa ekanini bildiradi. Bu turdagi service odatda mustaqil ishga tushirilmaydi, timer orqali chaqiriladi.

2. Timer faylini yaratish

sudo nano /etc/systemd/system/log-cleanup.timer
[Unit]
Description=log-cleanup.service uchun kunlik jadval

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
  • OnCalendar=daily — har kuni 00:00 da ishga tushirish (daily*-*-* 00:00:00 uchun qisqartma);
  • Persistent=true — server o'chirilgan yoki timer o'tkazib yuborilgan vaqt oralig'ida bo'lsa, keyingi yoqilganda o'tkazib yuborilgan ishga tushish darhol bajariladi (cron'da bunday xatti-harakat yo'q).

OnCalendar= cron ifodasidan ko'ra o'qilishi osonroq sintaksisga ega:

Maqsad OnCalendar= qiymati Taqribiy cron ekvivalenti
Har kuni yarim tunda daily yoki *-*-* 00:00:00 0 0 * * *
Har soatda hourly 0 * * * *
Har hafta dushanba, 03:00 Mon *-*-* 03:00:00 0 3 * * 1
Har oyning 1-sanasi, 04:30 *-*-01 04:30:00 30 4 1 * *

Yozilgan ifodani jadvalga aylantirishdan oldin tekshirish mumkin:

systemd-analyze calendar 'Mon *-*-* 03:00:00'
  Original form: Mon *-*-* 03:00:00
Normalized form: Mon *-*-* 03:00:00
    Next elapse: Mon 2026-07-27 03:00:00 UTC

Next elapse — ifoda haqiqatan kutilgan vaqtda ishga tushishini reboot yoki real kutishsiz tasdiqlash imkonini beradi.

3. Timer'ni yoqish

sudo systemctl daemon-reload
sudo systemctl enable --now log-cleanup.timer

--now timer'ni darhol ham yoqadi (faollashtiradi), ham boot vaqtida avtomatik ishga tushishini ta'minlaydi. Diqqat: yoqiladigan narsa log-cleanup.timer, log-cleanup.service emas — service'ni to'g'ridan-to'g'ri enable qilish shart emas, uni timer chaqiradi.

Holatni tekshirish

systemctl list-timers log-cleanup.timer
NEXT                        LEFT     LAST  PASSED  UNIT               ACTIVATES
Sat 2026-07-25 00:00:00 UTC 13h left n/a   n/a     log-cleanup.timer  log-cleanup.service
  • NEXT/LEFT — keyingi ishga tushish vaqti va unga qolgan vaqt;
  • ACTIVATES — timer qaysi service'ni ishga tushirishini ko'rsatadi.

Bu — cron'da yo'q, systemd timer'ning aniq afzalligi: navbatdagi ishga tushish vaqtini reboot yoki crontab -l orqali taxmin qilmasdan, to'g'ridan-to'g'ri ko'rish mumkin.

Natijani ko'rish: journalctl

journalctl -u log-cleanup.service --since today

Cron'da natija odatda alohida sozlanadigan email yoki cron.log orqali kuzatiladi (cron muhiti va loglari maqolasida ko'rilgan). systemd timer'da esa log-cleanup.servicening barcha chiqishi (stdout, stderr) avtomatik journalctlga tushadi — qo'shimcha sozlash shart emas.

Vazifa muvaffaqiyatli tugadimi yoki xato bilan tugadimi:

systemctl status log-cleanup.service

Qo'lda ishga tushirish

Jadvalni kutmasdan, testda vazifani darhol bajarish:

sudo systemctl start log-cleanup.service

Bu timer'ga tegmaydi, faqat service'ni bir marta ishga tushiradi — cron ifodasini vaqtincha o'zgartirmasdan sinash imkonini beradi.

cron va systemd timer: qachon qaysi birini tanlash

Mezon cron systemd timer
Sintaksis oddiyligi Bitta qator, tez yoziladi Ikkita fayl, ko'proq boilerplate
Natija va xatoni kuzatish Alohida sozlash kerak (email, log fayli) journalctl orqali avtomatik
O'tkazib yuborilgan vazifani qayta bajarish (server o'chiq bo'lganda) Yo'q Persistent=true bilan bor
Keyingi ishga tushish vaqtini oldindan ko'rish Qiyin systemctl list-timers bilan oson
Boshqa systemd unit'ga bog'liqlik (masalan, tarmoq tayyor bo'lgandan keyin) Yo'q Wants=, After= bilan mumkin
Konteynerlashtirilgan yoki minimal muhit Ko'pincha allaqachon o'rnatilgan systemd talab qiladi (ba'zi konteynerlarda yo'q)
Ko'nikma va hujjat tarqalganligi Juda keng tarqalgan, deyarli har joyda tanish systemd tizimlarida keng tarqalgan, lekin cron'chalik universal emas

Amalda ikkalasi ham to'g'ri javob bo'lishi mumkin: mavjud, systemd asosidagi serverda murakkabroq, kuzatuvni talab qiladigan vazifalar uchun timer qulayroq; oddiy, tez yoziladigan va boshqa tizimga ko'chirilishi mumkin bo'lgan vazifalar uchun cron hamon amaliy tanlov.

Ko'p uchraydigan xatolar

.serviceni enable qilib, .timerni unutish

systemctl enable log-cleanup.service o'zi jadval bo'yicha ishga tushirishni ta'minlamaydi — Type=oneshot service faqat timer yoki qo'lda chaqirilganda ishlaydi. Yoqilishi kerak bo'lgan narsa — .timer fayli.

daemon-reloadni unutish

Yangi yoki o'zgartirilgan unit fayldan keyin systemctl daemon-reload bajarilmasa, systemd eski holatni ishlatishda davom etadi.

Persistent=trueni cron xatti-harakati bilan adashtirish

Persistent=true faqat server o'chiq bo'lgan davrda o'tkazib yuborilgan ishga tushishni qoplaydi. Bu cron'dagi hech qanday sozlamaga to'g'ridan-to'g'ri mos kelmaydi — cron'da bunday vazifa umuman o'tkazib yuboriladi.

Amaliy mashqlar

  1. Oddiy echo/date bajaradigan Type=oneshot service va unga mos, har 5 daqiqada ishga tushadigan (OnCalendar=*:0/5) timer yarating.
  2. systemctl list-timers bilan keyingi ishga tushish vaqtini kuzating, so'ng journalctl -u bilan natijani tekshiring.
  3. systemd-analyze calendar bilan uchta har xil OnCalendar= ifodasini tekshirib, "Next elapse" natijasini kutganingiz bilan solishtiring.
  4. Xuddi shu vazifani avval cron qatori, keyin systemd timer sifatida yozing va ikkalasining sozlash hajmini solishtiring.

Xulosa

systemd timer cron bilan bir xil maqsadga xizmat qiladi — vaqt bo'yicha buyruq ishga tushirish — lekin buni alohida .service/.timer fayl juftligi, journalctl orqali avtomatik loglash va Persistent=true kabi qo'shimcha imkoniyatlar bilan bajaradi. Oddiy, tez yoziladigan vazifalar uchun cron hamon amaliy, lekin murakkabroq kuzatuv yoki bog'liqlik talab qiladigan vazifalar uchun systemd timer ko'proq nazorat beradi.

Manbalar