Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Rejalashtirilgan vazifa nima
- 2.2. cron ifodasi (5 maydon)
- 2.3. cron misollari
- 2.4. Windows Task Scheduler
- 2.5. Python: schedule va APScheduler
- 2.6. Idempotentlik va xatolar
- 2.7. Loglar va monitoring
- 2.8. Rejalashtirish — avtomatlashtirishning vaqti
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — cron maydonlarini tahlil qilish
- Misol 2 — Keyingi ishga tushish vaqtlari
- Misol 3 — Scheduler simulyatsiyasi
- Misol 4 — Idempotentlik (takrorlanishga chidamli)
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
26.9-dars: Rejalashtirilgan vazifalar (cron)
26-QISM — AVTOMATLASHTIRISH · 9-dars
1. Kirish va motivatsiya
Ba'zi ishlar muntazam takrorlanadi: har kuni ertalab hisobot, har soatda zaxira nusxa, har hafta tozalash, har oy hisob-kitob. Bularni qo'lda bajarish — zerikarli va unutiladi. Rejalashtirilgan vazifa (scheduled task) — skript avtomatik vaqtda ishga tushadi: siz vaqtni belgilaysiz (har kuni 09:00), tizim o'zi ishga tushiradi. Odam kutmaydi — mashina eslaydi. Bu avtomatlashtirishning vaqt o'lchami: nafaqat "avtomatik", balki "avtomatik kerakli vaqtda".
cron — Unix'ning rejalashtirish tizimi: cron ifodasi (5 maydon — daqiqa, soat, kun, oy, hafta kuni) bilan vaqt belgilanadi, cron demoni skriptni o'sha vaqtda ishga tushiradi. Windows'da — Task Scheduler. Python'da — schedule, APScheduler kutubxonalari (dastur ichida rejalashtirish). cron ifodasi: 0 9 * * * (har kuni 09:00), */15 * * * * (har 15 daqiqa), 0 0 * * 1 (har dushanba yarim tunda). Rejalashtirish — davriy avtomatlashtirish: bir marta sozlang, doimiy ishlaydi.
Real vaziyat. Bir loyihada har kuni ertalab foydalanuvchilarga hisobot yuborish kerak edi. Avval qo'lda: har ertalab skript ishga tushiriladi (unutiladi, kechikadi). Keyin cron: 0 8 * * * — har kuni 08:00 avtomatik. Skript o'zi ishladi, hisobot yuborildi, hech kim eslamadi ham. Bir yil ishladi — uzilishsiz. Sozladik va unutdik (yaxshi ma'noda). Cron — ishonchli vaqt xizmati.
Bu darsda rejalashtirilgan vazifalar (cron) ni o'rganamiz.
Bu darsda:
- Rejalashtirilgan vazifa nima
- cron ifodasi (5 maydon)
- cron misollari
- Windows Task Scheduler
- Python:
schedule,APScheduler - Idempotentlik va xatolar
- Loglar va monitoring
- Amaliy: scheduler mantigi
ℹ Misollarda cron ifodasi sof Python bilan (deterministik) tahlil qilinadi; real cron demoni/Task Scheduler operatsion tizim talab qiladi.
2. Nazariya — chuqur tushuntirish
2.1. Rejalashtirilgan vazifa nima
Vaqtda avtomatik ishga tushish:
Skript + vaqt jadvali → tizim (cron/scheduler)
→ belgilangan vaqtda avtomatik ishga tushiradi
Har kuni 09:00, har soatda, har dushanba...Rejalashtirilgan vazifa (scheduled task, cron job) — skript oldindan belgilangan vaqtda avtomatik ishga tushadi: siz jadvalni belgilaysiz (har kuni 09:00, har 15 daqiqa), tizim (cron demoni yoki scheduler) o'sha vaqtda skriptni chaqiradi. Odam ishtiroki yo'q — mashina vaqtni kuzatadi. Bu davriy (takrorlanuvchi) avtomatlashtirish: hisobot, zaxira, tozalash, tekshirish. Bir marta sozlang — doimiy ishlaydi. Vaqt — avtomatlashtirishning o'lchami.
2.2. cron ifodasi (5 maydon)
Vaqtni belgilash:
┌─ daqiqa (0-59)
│ ┌─ soat (0-23)
│ │ ┌─ oy kuni (1-31)
│ │ │ ┌─ oy (1-12)
│ │ │ │ ┌─ hafta kuni (0-6, 0=yakshanba)
│ │ │ │ │
* * * * * → har daqiqa
0 9 * * * → har kuni 09:00 cron ifodasi — 5 maydondan iborat (bo'shliq bilan ajratilgan): daqiqa (0–59), soat (0–23), oy kuni (1–31), oy (1–12), hafta kuni (0–6, 0=yakshanba). Har maydonda: * (har), 5 (aniq qiymat), 1,15 (ro'yxat), 9-17 (oraliq), */15 (har 15 — qadam). Masalan 0 9 * * * = daqiqa 0, soat 9, har kun, har oy, har hafta kuni = har kuni 09:00. cron ifodasi — vaqt jadvalini ixcham yozish. 5 maydon — vaqtni to'liq belgilaydi.
2.3. cron misollari
Amaliy ifodalar:
| Ifoda | Ma'nosi |
|---|---|
* * * * * |
Har daqiqa |
0 * * * * |
Har soat (00 daqiqada) |
0 9 * * * |
Har kuni 09:00 |
*/15 * * * * |
Har 15 daqiqa |
0 0 * * 1 |
Har dushanba 00:00 |
0 0 1 * * |
Har oy 1-kuni 00:00 |
cron ifodalari — amaliy jadvallar: */15 * * * * (har 15 daqiqa — tez-tez tekshirish), 0 9 * * * (har kuni ertalab — hisobot), 0 0 * * 1 (har hafta — dushanba tozalash), 0 0 1 * * (har oy — hisob-kitob). Qadam (*/N), oraliq (9-17), ro'yxat (1,15) birlashtiriladi: 0 9-17 * * 1-5 (ish kunlari 09:00–17:00 har soat). cron ifodasi — kuchli va ixcham. Onlayn tekshirgichlar (crontab.guru) yordam beradi.
2.4. Windows Task Scheduler
Windows'da rejalashtirish:
Task Scheduler (Vazifalar rejalashtirgichi):
- GUI (grafik) yoki schtasks (buyruq)
- Trigger (vaqt) + Action (skript)
schtasks /create /tn "hisobot" /tr "py skript.py" /sc daily /st 09:00 Windows Task Scheduler — Windows'ning rejalashtirish tizimi (cron'ning Windows muqobili): Trigger (qachon — vaqt, hodisa) + Action (nima — skript ishga tushirish). GUI (grafik interfeys) yoki schtasks buyruq. Unix cron sintaksisidan farq qiladi, lekin g'oya bir xil: vaqt + amal. Ko'p Python kutubxonalari (APScheduler) ikkala platformada ishlaydi (portativ). Platforma farqi — cron (Unix/Linux server) yoki Task Scheduler (Windows).
2.5. Python: schedule va APScheduler
Dastur ichida rejalashtirish:
# schedule (oddiy):
import schedule
schedule.every().day.at("09:00").do(hisobot)
schedule.every(15).minutes.do(tekshir)
while True:
schedule.run_pending()
time.sleep(1)
# APScheduler — kuchli (cron ifoda, fon) Python kutubxonalari: schedule — oddiy, o'qiladigan (schedule.every().day.at("09:00").do(job)) — kichik skript ichida; APScheduler — kuchli (cron ifoda, oraliq, fon vazifa, doimiy saqlash) — katta ilova. Farqi cron'dan: bu dastur ichida ishlaydi (Python jarayoni kerak), cron — operatsion tizim darajasida (mustaqil). Kichik loyiha — schedule; server — cron yoki APScheduler. Kutubxona — kod ichida jadval.
2.6. Idempotentlik va xatolar
Takrorlanishga chidamli:
# vazifa bir necha marta ishlashi mumkin (qayta urinish)
# idempotent: bir xil natija (zarar yo'q)
if not already_done(sana): # tekshir
process(sana)
mark_done(sana)Idempotentlik — vazifa bir necha marta ishlasa ham bir xil natija (qo'shimcha zarar yo'q): cron vazifa qayta ishlashi mumkin (qayta urinish, ikki demon). Masalan hisobot ikki marta yuborilmasin — "bugun yuborildimi?" tekshirish. Xato boshqarish: vazifa yiqilsa — log, ogohlantirish (email); qayta urinish; keyingi ishga ta'sir qilmasin. Rejalashtirilgan vazifa nazoratsiz ishlaydi (odam yo'q) — shuning uchun mustahkam bo'lishi kerak. Idempotentlik — ishonchlilik.
2.7. Loglar va monitoring
Ishlaganini bilish:
import logging
logging.info(f"vazifa boshlandi: {datetime.now()}")
# ... ish ...
logging.info(f"vazifa tugadi: {n} qator")
# monitoring: vazifa ishlamasa — ogohlantirLog va monitoring — rejalashtirilgan vazifa ko'rinmaydi (fonda, odam kutmaydi), shuning uchun log (nima bo'ldi — boshlandi, tugadi, xato) va monitoring (ishlayaptimi — "dead man's switch": vazifa ishlamasa ogohlantir) zarur. Loglar: qachon ishladi, qancha vaqt, natija, xato. Monitoring: kutilgan vaqtda ishlamasa xabar (masalan Healthchecks.io — vazifa "men tirikman" signali yuboradi). Ko'rinmas jarayon — log bilan ko'rinadi. Log — nazoratsiz ishning ko'zi.
2.8. Rejalashtirish — avtomatlashtirishning vaqti
Rejalashtirish — avtomatlashtirishga vaqt o'lchami qo'shadi: skript 26.1-bob nima qilishni, cron qachon qilishni belgilaydi. Davriy ishlar: zaxira (kunlik), hisobot (kunlik/haftalik), tozalash (o'chirish), sinxronizatsiya (API — 26.7), tekshirish (monitoring). Sozlash joyi: cron (Linux server — crontab -e), Task Scheduler (Windows), APScheduler (ilova ichida), bulut (GitHub Actions, cloud scheduler). "Bir marta sozla — doimiy ishla" — avtomatlashtirishning kuchi. Rejalashtirish — vaqtni boshqarish (odam o'rniga mashina eslaydi).
3. Tez ma'lumotnoma
cron ifodasi (5 maydon):
daqiqa(0-59) soat(0-23) oy-kuni(1-31) oy(1-12) hafta-kuni(0-6)
* = har · 5 = aniq · 1,15 = ro'yxat · 9-17 = oraliq · */15 = qadam
Misollar:
0 9 * * * har kuni 09:00
*/15 * * * * har 15 daqiqa
0 0 * * 1 har dushanba 00:00
0 9-17 * * 1-5 ish kunlari har soat (9-17)# Linux: crontab -e → 0 9 * * * py /yol/skript.py
# Windows: schtasks /create /sc daily /st 09:00 ...
# Python schedule:
import schedule, time
schedule.every().day.at("09:00").do(job)
while True: schedule.run_pending(); time.sleep(1)
# APScheduler (cron ifoda):
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
sched.add_job(job, "cron", hour=9, minute=0)
sched.start()
# idempotent: if not done(sana): process(); mark(sana)
# log: logging.info(...) · monitoring: dead man's switchRejalashtirilgan vazifa xulosasi
cron: 5 maydon (daqiqa soat kun oy hafta) · vaqtda avtomatik
Windows: Task Scheduler · Python: schedule, APScheduler
idempotent (qayta urinish) · log + monitoring (ko'rinmas)4. Batafsil misollar
Misollarda cron ifodasi sof Python bilan (deterministik) tahlil qilinadi — real cron demoni operatsion tizim talab qiladi. Sana belgilangan (deterministik).
Misol 1 — cron maydonlarini tahlil qilish
"""cron maydon tahlili: *, aniq, ro'yxat, oraliq, qadam."""
def parse_field(field: str, lo: int, hi: int) -> set:
if field == "*":
return set(range(lo, hi + 1))
vals: set = set()
for part in field.split(","):
if "/" in part:
base, step = part.split("/")
boshi = lo if base == "*" else int(base.split("-")[0])
vals |= set(range(boshi, hi + 1, int(step)))
elif "-" in part:
a, b = part.split("-")
vals |= set(range(int(a), int(b) + 1))
else:
vals.add(int(part))
return vals
def main() -> None:
print("=== 1. '*' (har) ===")
print(f" daqiqa '*' (0-59) soni: {len(parse_field('*', 0, 59))}")
print("\n=== 2. Qadam '*/15' ===")
print(f" daqiqa '*/15': {sorted(parse_field('*/15', 0, 59))}")
print("\n=== 3. Oraliq '9-17' ===")
print(f" soat '9-17': {sorted(parse_field('9-17', 0, 23))}")
print("\n=== 4. Ro'yxat '1,15' ===")
print(f" kun '1,15': {sorted(parse_field('1,15', 1, 31))}")
print(" ⭐ cron maydon: * / aniq / ro'yxat / oraliq / qadam")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. '*' (har) ===
daqiqa '*' (0-59) soni: 60
=== 2. Qadam '*/15' ===
daqiqa '*/15': [0, 15, 30, 45]
=== 3. Oraliq '9-17' ===
soat '9-17': [9, 10, 11, 12, 13, 14, 15, 16, 17]
=== 4. Ro'yxat '1,15' ===
kun '1,15': [1, 15]
⭐ cron maydon: * / aniq / ro'yxat / oraliq / qadamNima ko'rsatdi: 2.2, 2.3-bo'limlar.
Misol 2 — Keyingi ishga tushish vaqtlari
"""cron moslik: berilgan ifodaga keyingi ishga tushish vaqtlari."""
from datetime import datetime, timedelta
def parse_field(field: str, lo: int, hi: int) -> set:
if field == "*":
return set(range(lo, hi + 1))
vals: set = set()
for part in field.split(","):
if "/" in part:
base, step = part.split("/")
vals |= set(range(lo, hi + 1, int(step)))
elif "-" in part:
a, b = part.split("-")
vals |= set(range(int(a), int(b) + 1))
else:
vals.add(int(part))
return vals
def matches(expr: str, dt: datetime) -> bool:
m, h, dom, mon, dow = expr.split()
return (
dt.minute in parse_field(m, 0, 59)
and dt.hour in parse_field(h, 0, 23)
and dt.day in parse_field(dom, 1, 31)
and dt.month in parse_field(mon, 1, 12)
and (dt.weekday() + 1) % 7 in parse_field(dow, 0, 6)
)
def next_runs(expr: str, start: datetime, n: int) -> list:
res, cur = [], start.replace(second=0, microsecond=0)
while len(res) < n:
cur += timedelta(minutes=1)
if matches(expr, cur):
res.append(cur)
return res
def main() -> None:
start = datetime(2026, 1, 1, 0, 0) # payshanba
print("=== 1. Har kuni 09:00 ('0 9 * * *') ===")
r = next_runs("0 9 * * *", start, 3)
print(f" keyingi 3: {[d.strftime('%m-%d %H:%M') for d in r]}")
print("\n=== 2. Har 30 daqiqa ('*/30 * * * *') ===")
r = next_runs("*/30 * * * *", start, 3)
print(f" keyingi 3: {[d.strftime('%H:%M') for d in r]}")
print("\n=== 3. Har dushanba 08:00 ('0 8 * * 1') ===")
r = next_runs("0 8 * * 1", start, 2)
print(f" keyingi 2: {[d.strftime('%m-%d %H:%M') for d in r]}")
print(" (2026-01-05 va 01-12 — dushanbalar)")
print(" ⭐ cron — keyingi ishga tushish vaqtlari")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Har kuni 09:00 ('0 9 * * *') ===
keyingi 3: ['01-01 09:00', '01-02 09:00', '01-03 09:00']
=== 2. Har 30 daqiqa ('*/30 * * * *') ===
keyingi 3: ['00:30', '01:00', '01:30']
=== 3. Har dushanba 08:00 ('0 8 * * 1') ===
keyingi 2: ['01-05 08:00', '01-12 08:00']
(2026-01-05 va 01-12 — dushanbalar)
⭐ cron — keyingi ishga tushish vaqtlariNima ko'rsatdi: 2.2, 2.3-bo'limlar.
Misol 3 — Scheduler simulyatsiyasi
"""scheduler simulyatsiya: belgilangan vaqtda vazifa ishga tushadi (mock soat)."""
from datetime import datetime, timedelta
def parse_field(field: str, lo: int, hi: int) -> set:
if field == "*":
return set(range(lo, hi + 1))
if "/" in field:
step = int(field.split("/")[1])
return set(range(lo, hi + 1, step))
return {int(field)}
def matches(expr: str, dt: datetime) -> bool:
m, h, dom, mon, dow = expr.split()
return dt.minute in parse_field(m, 0, 59) and dt.hour in parse_field(h, 0, 23)
def main() -> None:
log: list = []
def hisobot() -> None:
log.append("hisobot yuborildi")
# mock soat: 08:58 dan 09:02 gacha (5 daqiqa) simulyatsiya
clock = datetime(2026, 1, 1, 8, 58)
print("=== 1. Simulyatsiya (08:58 → 09:02) ===")
for _ in range(5):
clock += timedelta(minutes=1)
ishladi = matches("0 9 * * *", clock)
if ishladi:
hisobot()
belgi = "ISHLADI" if ishladi else "-"
print(f" {clock.strftime('%H:%M')} {belgi}")
print("\n=== 2. Natija ===")
print(f" vazifa necha marta ishladi: {len(log)}")
print("\n=== 3. Har 2 daqiqa vazifa ===")
log2: list = []
clock = datetime(2026, 1, 1, 10, 0)
for _ in range(6):
if matches("*/2 * * * *", clock):
log2.append(clock.strftime("%H:%M"))
clock += timedelta(minutes=1)
print(f" ishga tushgan vaqtlar: {log2}")
print("\n=== 4. Xulosa ===")
print(" scheduler: har daqiqa tekshiradi, moslikda ishga tushiradi")
print(" ⭐ scheduler — vaqt kuzatadi, vazifani chaqiradi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Simulyatsiya (08:58 → 09:02) ===
08:59 -
09:00 ISHLADI
09:01 -
09:02 -
09:03 -
=== 2. Natija ===
vazifa necha marta ishladi: 1
=== 3. Har 2 daqiqa vazifa ===
ishga tushgan vaqtlar: ['10:00', '10:02', '10:04']
=== 4. Xulosa ===
scheduler: har daqiqa tekshiradi, moslikda ishga tushiradi
⭐ scheduler — vaqt kuzatadi, vazifani chaqiradiNima ko'rsatdi: 2.1, 2.5-bo'limlar.
Misol 4 — Idempotentlik (takrorlanishga chidamli)
"""idempotentlik: vazifa qayta ishlasa ham bir xil natija (ikki marta yubormaydi)."""
class HisobotVazifasi:
def __init__(self) -> None:
self.yuborilgan: set = set() # qaysi kunlar yuborildi
self.jurnal: list = []
def bajar(self, sana: str) -> str:
# idempotent tekshirish: bugun yuborildimi?
if sana in self.yuborilgan:
self.jurnal.append(f"{sana}: o'tkazib yuborildi (allaqachon)")
return "skip"
# ish
self.yuborilgan.add(sana)
self.jurnal.append(f"{sana}: hisobot yuborildi")
return "sent"
def main() -> None:
v = HisobotVazifasi()
print("=== 1. Birinchi marta ===")
print(f" 2026-01-01 → {v.bajar('2026-01-01')}")
print("\n=== 2. Qayta urinish (bir xil kun) ===")
print(f" 2026-01-01 → {v.bajar('2026-01-01')} (takror emas!)")
print("\n=== 3. Keyingi kun ===")
print(f" 2026-01-02 → {v.bajar('2026-01-02')}")
print("\n=== 4. Jurnal ===")
for satr in v.jurnal:
print(f" {satr}")
print(f" yuborilgan kunlar: {len(v.yuborilgan)}")
print(" ⭐ idempotent — qayta urinish zararsiz (bir xil natija)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Birinchi marta ===
2026-01-01 → sent
=== 2. Qayta urinish (bir xil kun) ===
2026-01-01 → skip (takror emas!)
=== 3. Keyingi kun ===
2026-01-02 → sent
=== 4. Jurnal ===
2026-01-01: hisobot yuborildi
2026-01-01: o'tkazib yuborildi (allaqachon)
2026-01-02: hisobot yuborildi
yuborilgan kunlar: 2
⭐ idempotent — qayta urinish zararsiz (bir xil natija)Nima ko'rsatdi: 2.6-bo'lim.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "cron murakkab" | 5 maydon (vaqt) |
| "Faqat Linux" | Windows Task Scheduler ham |
| "Vazifa bir marta" | Davriy (takror) |
| "Xato bo'lmaydi" | Idempotent, log kerak |
| "Log keraksiz" | Ko'rinmas — log zarur |
| "schedule = cron" | schedule dastur ichida |
| "Bir marta ishla" | Qayta urinish mumkin |
| "Sozla va unut" | Monitoring kerak |
6. Keng tarqalgan xatolar va yechimlari
1. cron maydon xato
0 9 * * * # daqiqa soat kun oy hafta (5 maydon) # ✅
9 0 * * * # ⚠️ soat 0 daqiqa 9 = 00:09 (adashdi)2. Idempotent emas (ikki marta)
process(sana) # ⚠️ qayta = ikki marta
if not done(sana): process(sana) # ✅3. Xato boshqarilmagan
job() # yiqilsa jim o'ladi # ⚠️
try: job() except: log_error() # ✅ log4. Log yo'q (ko'rinmas)
# ishlaganini hech kim bilmaydi # ⚠️
logging.info("boshlandi/tugadi") # ✅5. Muhit farqi (cron minimal PATH)
py skript.py # cron'da py topilmaydi # ⚠️
/full/path/py /full/path/skript.py # ✅ to'liq yo'l6. Vaqt mintaqasi (timezone)
0 9 * * * # server UTC? mahalliy? # ⚠️
# timezone aniqla (APScheduler timezone=) # ✅7. Monitoring yo'q (jim yiqiladi)
# vazifa ishlamasa hech kim sezmaydi # ⚠️
# dead man's switch (Healthchecks.io) # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 26.1-dars (o'tilgan): Skript — cron nima ishga tushiradi
- 26.2-dars (o'tilgan): Fayl avtomatlashtirish — davriy
- 26.7-dars (o'tilgan): API — davriy sinxronizatsiya
- 28-qism: Infratuzilma — server cron
- 09-dars (o'tilgan): Xatolar — vazifa mustahkamligi
8. Eng yaxshi amaliyotlar
cron ifodasini tekshir (crontab.guru).
To'liq yo'l ishlat (cron minimal muhit).
Idempotent yoz (qayta urinish zararsiz).
Xato boshqar (try/except, log).
Log yoz (ko'rinmas jarayon).
Monitoring (dead man's switch).
Timezone aniqla.
Vazifa qisqa (uzun bo'lsa — navbat).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # rejalashtirilgan vazifa nima?
2. # cron nima?
3. # cron necha maydon?
4. # maydonlar qaysi?
5. # '0 9 * * *' nima?
6. # '*/15' nima?
7. # Windows'da nima?
8. # schedule nima?
9. # APScheduler nima?
10. # idempotentlik nima?
11. # nega log?
12. # dead man's switch nima?Javoblar
- Skript belgilangan vaqtda avtomatik ishga tushadi
- Unix rejalashtirish tizimi
- 5 maydon
- Daqiqa, soat, oy-kuni, oy, hafta-kuni
- Har kuni 09:00
- Har 15 (qadam)
- Task Scheduler
- Oddiy Python rejalashtirish kutubxonasi
- Kuchli rejalashtirish (cron ifoda)
- Qayta ishlasa bir xil natija
- Ko'rinmas — nima bo'ldi bilish
- Vazifa ishlamasa ogohlantirish
Vazifa 2: Xatolarni tuzating
1. 9 0 * * * # har kuni 09:00 xohladi
2. process(sana) # qayta = ikki marta
3. job() # yiqilsa jim
4. # log yo'q
5. py skript.py # cron'daJavoblar
1. 0 9 * * * # daqiqa soat (0 9)
2. if not done(sana): process(sana)
3. try: job() except: log_error()
4. logging.info("boshlandi/tugadi")
5. /full/path/py /full/path/skript.pyVazifa 3: cron ifoda
Yozing:
- Har soat
- Har kuni 18:00
- Har dushanba
- Har 10 daqiqa
Vazifa 4: Moslik
Aniqlang:
0 9 * * **/150 0 * * 1- Keyingi vaqt
Vazifa 5: Scheduler
Simulyatsiya:
- Mock soat
- Moslik
- Ishga tushirish
- Log
Vazifa 6: Idempotentlik
Chidamli:
- Tekshir
- Belgila
- Qayta = skip
- Bir xil natija
Vazifa 7: O'ylash
Rejalashtirilgan vazifa nazoratsiz ishlaydi — odam kutmaydi, ko'rmaydi (fonda, belgilangan vaqtda). Nima uchun bu "ko'rinmaslik" idempotentlik, log va monitoringni oddiy skriptdan ko'ra muhimroq qiladi, va nega "bir marta sozla — doimiy ishla" ham kuch, ham xavf (jim yiqilish)?
Javob
Qisqa javob: "Ko'rinmaslik" idempotentlik, log, monitoringni muhimroq qiladi, chunki: rejalashtirilgan vazifa odamsiz ishlaydi (kimse kutmaydi, tekshirmaydi) — muammo jim yuz beradi (skript qo'lda ishga tushirilsa, odam natijani ko'radi; cron'da — yo'q). Idempotentlik muhim: cron vazifa qayta ishlashi mumkin (qayta urinish, ikki demon, qo'lda takror) — idempotent bo'lmasa, ikki marta zarar (ikki hisobot, ikki to'lov). Log muhim: ko'rinmas jarayon — log yagona "ko'z" (nima bo'ldi, qachon, xato). Monitoring muhim: vazifa jim yiqilsa (server o'chdi, xato) hech kim sezmaydi — dead man's switch ogohlantiradi. "Bir marta sozla — doimiy ishla" kuch: inson mehnatini abadiy avtomatlashtiradi (bir yil, o'n yil ishlaydi); xavf: unutiladi (sozlab qo'yildi, e'tibordan chiqdi) — jim yiqilsa yoki noto'g'ri ishlasa, uzoq vaqt sezilmaydi (eski hisobot, to'lganib qolgan disk). Yechim: ko'rinmas jarayonni ko'rinadigan qilish (log, monitoring, ogohlantirish) — mashina eslaydi, lekin odam nazorat qiladi.
1. Ko'rinmaslik — jim muammo
Skript (qo'lda): odam natijani ko'radi. cron: odam yo'q — muammo jim (sezilmas).
2. Idempotentlik (qayta ishlash)
cron qayta ishlashi mumkin. Idempotent bo'lmasa — ikki marta zarar (hisobot, to'lov).
3. Log — yagona ko'z
| Nima | Nega |
|---|---|
| Boshlandi/tugadi | Ishladimi |
| Vaqt | Qachon, qancha |
| Xato | Nima yiqildi |
4. Monitoring — jim yiqilish
Vazifa yiqilsa hech kim sezmaydi. Dead man's switch ogohlantiradi.
5. Kuch va xavf
- Kuch: bir marta sozla — abadiy avtomatik (inson mehnati yo'q)
- Xavf: unutiladi — jim yiqilsa uzoq sezilmaydi
6. Xulosa
- Ko'rinmaslik — muammo jim (odam yo'q)
- Idempotent (qayta = zararsiz), log (ko'z), monitoring (ogohlantirish)
- Kuch: doimiy avtomatik; xavf: jim yiqilish
- Ko'rinmas jarayonni ko'rinadigan qil (nazorat)
Nimani mustahkamlaydi: 2.6, 2.7-bo'limlar.
Xulosa
Bu darsda rejalashtirilgan vazifalar (cron) ni o'rgandik.
Eng muhim uch fikr:
Rejalashtirilgan vazifa va cron ifodasi. Rejalashtirilgan vazifa — skript belgilangan vaqtda avtomatik ishga tushadi (har kuni 09:00, har 15 daqiqa): siz jadvalni belgilaysiz, tizim (cron demoni/scheduler) o'sha vaqtda chaqiradi — odamsiz, davriy avtomatlashtirish. cron ifodasi — 5 maydon: daqiqa (0–59), soat (0–23), oy-kuni (1–31), oy (1–12), hafta-kuni (0–6). Har maydonda
*(har), aniq (5), ro'yxat (1,15), oraliq (9-17), qadam (*/15).0 9 * * *= har kuni 09:00;*/15 * * * *= har 15 daqiqa;0 0 * * 1= har dushanba.Sozlash joylari va idempotentlik. Rejalashtirish: cron (Linux server —
crontab -e), Windows Task Scheduler (Trigger + Action,schtasks), Pythonschedule(oddiy —every().day.at("09:00")) yokiAPScheduler(kuchli — cron ifoda, fon) — dastur ichida. Idempotentlik — vazifa qayta ishlasa ham bir xil natija (qo'shimcha zarar yo'q): cron qayta ishlashi mumkin (qayta urinish) — "bugun bajarildimi?" tekshirish (ikki hisobot/to'lov emas). Idempotentlik — nazoratsiz ishning ishonchliligi.Log, monitoring va nazorat. Rejalashtirilgan vazifa ko'rinmaydi (fonda, odam kutmaydi) — shuning uchun log (boshlandi, tugadi, xato — nima bo'ldi) va monitoring ("dead man's switch" — vazifa jim yiqilsa ogohlantir) zarur. Keng xatolar: cron maydon adashish (
9 0vs0 9), idempotent emaslik, to'liq yo'l bermaslik (cron minimal PATH), timezone. "Bir marta sozla — doimiy ishla" — kuch (inson mehnatini abadiy avtomatlashtiradi), lekin xavf (unutiladi, jim yiqilish) — ko'rinmas jarayonni log/monitoring bilan ko'rinadigan qilish. Rejalashtirish — avtomatlashtirishga vaqt o'lchami: skript nima qilishni, cron qachon qilishni. Mashina eslaydi — odam nazorat qiladi.
Keyingi darsda Excel va hujjatlar bilan ishlash ni o'rganamiz: Python bilan Excel (openpyxl), Word, PDF hujjatlarni o'qish, yozish va avtomatik yaratish — ofis avtomatlashtirishi.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!