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
journalctlorqali 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:
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
[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
[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:00uchun 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:
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
--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
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
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:
Qo'lda ishga tushirish
Jadvalni kutmasdan, testda vazifani darhol bajarish:
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
- Oddiy
echo/datebajaradiganType=oneshotservice va unga mos, har 5 daqiqada ishga tushadigan (OnCalendar=*:0/5) timer yarating. systemctl list-timersbilan keyingi ishga tushish vaqtini kuzating, so'ngjournalctl -ubilan natijani tekshiring.systemd-analyze calendarbilan uchta har xilOnCalendar=ifodasini tekshirib, "Next elapse" natijasini kutganingiz bilan solishtiring.- 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.