Rejalashtirish — cron va systemd timer
Muammodan boshlaylik
Zaxira skripti tayyor (39-dars). Endi uni har kecha soat 3:00 da ishga tushirish kerak. Har kecha budilnik qo'yib turish — variant emas. Yana:
- Har 5 daqiqada ilova sog'lig'ini tekshirish
- Har dushanba haftalik hisobot yuborish
- Har oy eski loglarni tozalash
Linux da vazifalarni vaqt bo'yicha bajarish uchun — cron (klassik) va systemd timer (zamonaviy).
cron — klassik rejalashtiruvchi
Har bir foydalanuvchining o'z crontab i bor:
crontab -e # tahrirlash (birinchi marta muharrir so'raydi — nano ni tanlang)
crontab -l # ko'rish
Format
┌───────────── daqiqa (0–59)
│ ┌─────────── soat (0–23)
│ │ ┌───────── oy kuni (1–31)
│ │ │ ┌─────── oy (1–12)
│ │ │ │ ┌───── hafta kuni (0–7; 0 va 7 = yakshanba)
│ │ │ │ │
* * * * * buyruq
Belgilar
| Belgi | Ma'nosi | Misol |
|---|---|---|
* |
Har bir | * soatda — har soat |
, |
Ro'yxat | 1,15 — 1 va 15 da |
- |
Diapazon | 1-5 — dushanba–juma |
/ |
Qadam | */5 — har 5 da |
Misollar
0 3 * * * har kuni 03:00 da
*/5 * * * * har 5 daqiqada
0 * * * * har soat boshida
30 9 * * 1-5 ish kunlari 09:30 da
0 0 * * 0 har yakshanba yarim tunda
0 4 1 * * har oyning 1-sanasida 04:00 da
0 9,18 * * * har kuni 09:00 va 18:00 da
Qisqartmalar:
@reboot server yuklanganda
@daily = 0 0 * * *
@hourly = 0 * * * *
@weekly = 0 0 * * 0
[!TIP] Ifodani tekshirish uchun: crontab.guru — cron ifodasini oddiy tilga tarjima qiladi ("At 03:00 every day").
Haqiqiy crontab
# Kunlik zaxira
0 3 * * * /opt/scripts/zaxira.sh dokon 14 >> /var/log/zaxira.log 2>&1
# Har 5 daqiqada sog'liq tekshiruvi
*/5 * * * * /opt/scripts/tekshir.sh
# Har dushanba hisobot
0 8 * * 1 /opt/scripts/hisobot.sh | mail -s "Haftalik hisobot" admin@dokon.uz
cron tuzoqlari
cron skriptlari terminalda ishlaydi-yu, cron da — yo'q. Sabablari deyarli har doim bir xil:
1. PATH juda qisqa
cron da PATH=/usr/bin:/bin — node, docker, /usr/local/bin dagi dasturlar topilmaydi.
# ❌
0 3 * * * node /opt/dokon/tozala.js
# ✅ absolyut yo'llar
0 3 * * * /usr/bin/node /opt/dokon/tozala.js
# ✅ yoki crontab boshida PATH
PATH=/usr/local/bin:/usr/bin:/bin
2. Joriy papka — uy papka
Skript nisbiy yo'llar ishlatsa (./config.json) — topilmaydi. Skript ichida: cd "$(dirname "$0")" yoki absolyut yo'llar.
3. Muhit o'zgaruvchilari yo'q
.bashrc cron da o'qilmaydi. Kerakli o'zgaruvchilar — skript ichida yoki .env ni yuklash orqali.
4. Chiqish yo'qoladi
Yo'naltirilmasa, cron natijani "pochta" orqali yuborishga urinadi — odatda hech qayerga. Har doim log ga:
0 3 * * * /opt/scripts/zaxira.sh >> /var/log/zaxira.log 2>&1
5. % — maxsus belgi
crontab da % — yangi qator degani. date +%F ni date +\%F deb yozish kerak. Yaxshisi — bunday mantiqni skript ichiga olib chiqing.
Debug
grep CRON /var/log/syslog | tail # cron ishga tushirdimi?
journalctl -u cron --since today
cron muhitini simulyatsiya qilib sinash:
env -i HOME=$HOME PATH=/usr/bin:/bin /bin/sh -c '/opt/scripts/zaxira.sh dokon'
Tizim cron i
crontab -e — foydalanuvchiniki. Tizim vazifalari uchun:
ls /etc/cron.d/ # alohida fayllar (foydalanuvchi ustuni bilan)
ls /etc/cron.daily/ # har kuni bajariladigan skriptlar
ls /etc/cron.weekly/
/etc/cron.d/ dagi format — qo'shimcha foydalanuvchi ustuni bilan:
# /etc/cron.d/dokon
0 3 * * * deploy /opt/scripts/zaxira.sh dokon 14 >> /var/log/zaxira.log 2>&1
Fayl sifatida Git da saqlanadi va avtomatik o'rnatiladi — crontab -e dan qulayroq.
systemd timer — zamonaviy usul
systemd (25-dars) o'z rejalashtiruvchisiga ega. Ikki fayl kerak: xizmat (nima) va timer (qachon).
sudo nano /etc/systemd/system/zaxira.service
[Unit]
Description=Dokon bazasi zaxirasi
[Service]
Type=oneshot
User=deploy
ExecStart=/opt/scripts/zaxira.sh dokon 14
sudo nano /etc/systemd/system/zaxira.timer
[Unit]
Description=Har kecha zaxira
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=5min
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now zaxira.timer
systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sat 2026-11-07 03:02:41 +05 12h left - - zaxira.timer zaxira.service
Type=oneshot— bir marta bajarilib tugaydigan vazifaOnCalendar— vaqt:daily,hourly,Mon *-*-* 08:00,*:0/5(har 5 daqiqa)Persistent=true— server o'sha vaqtda o'chiq bo'lgan bo'lsa, yoqilganda o'tkazib yuborilganini bajaradiRandomizedDelaySec— tasodifiy kechikish (ko'p serverlar bir vaqtda bazaga yopirilmasligi uchun)
Qo'lda sinash va loglar:
sudo systemctl start zaxira.service # hoziroq bajarish
journalctl -u zaxira.service # natija
systemd-analyze calendar "Mon *-*-* 08:00" # ifodani tekshirish
Timer asosida intervallar ham:
[Timer]
OnBootSec=5min
OnUnitActiveSec=15min
— yuklanishdan 5 daqiqa keyin, keyin har 15 daqiqada.
cron yoki systemd timer?
| cron | systemd timer | |
|---|---|---|
| Sozlash | 1 qator | 2 fayl |
| Loglar | O'zingiz yo'naltirasiz | journald da avtomatik |
| O'tkazib yuborilgan vazifalar | Yo'qoladi | Persistent=true — bajariladi |
| Bir vaqtda ikki nusxa | Mumkin (flock kerak) |
Yo'q — xizmat allaqachon ishlayotgan bo'lsa, qayta boshlanmaydi |
| Resurs chegaralari, izolyatsiya | Yo'q | MemoryMax, ProtectSystem (25-dars) |
| Tezkor qo'shish | ✅ |
Tez va oddiy narsalar — cron. Production dagi muhim vazifalar (zaxira!) — systemd timer.
Nima uchun shunday?
Nima uchun cron skriptlari terminaldagidan boshqacha muhitda ishlaydi — bu ataylab noqulay qilinganmi?
Bu — takrorlanuvchanlik uchun. Terminalingiz muhiti tasodifiy: .bashrc dagi alias lar, nvm orqali o'rnatilgan Node, qo'lda export qilingan o'zgaruvchilar. Agar cron shu muhitni meros olsa, skript faqat sizning sessiyangiz sozlamalari bilan ishlardi — va kimdir .bashrc ni o'zgartirsa, kechasi zaxira jimgina buzilardi. Minimal, aniq muhit esa skriptni o'zining barcha bog'liqliklarini aniq ko'rsatishga majbur qiladi — absolyut yo'llar, aniq o'zgaruvchilar. Natija: skript har kecha, har bir serverda bir xil ishlaydi.
Xulosa
Eslab qoling:
crontab -e/-l; format:daqiqa soat kun oy hafta_kuni buyruq*/5— har 5;1-5— diapazon;0 3 * * *— har kuni 03:00; crontab.guru- cron tuzoqlari: qisqa PATH, uy papka,
.bashrcyo'q,%— absolyut yo'llar ishlating - Har doim
>> log 2>&1 /etc/cron.d/— tizim vazifalari, Git da saqlash qulay- systemd timer:
.service(Type=oneshot) +.timer(OnCalendar,Persistent=true) systemctl list-timers,journalctl -u nom.service- Muhim vazifalar — systemd timer
Keyingi dars
41-dars: Mashqlar — zaxira nusxa skripti