Rejalashtirish — cron va systemd timer

~12 daq · Linux · Bash skriptlar

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 vazifa
  • OnCalendar — 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 bajaradi
  • RandomizedDelaySec — 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, .bashrc yo'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