Skip to content

9. cron va avtomatlashtirish — 15 ta masala

Cron vazifalarini sinash uchun avval ~/lab/jobs katalogini yarating:

mkdir -p ~/lab/jobs

1. Joriy foydalanuvchining cron jadvalini ko'ring va tahrirlang.
Misol: no crontab for student (hali yo'q bo'lsa).

Yechim

crontab -l
crontab -e
crontab -e har bir foydalanuvchi uchun alohida jadvalni ochadi va saqlashda sintaksisni tekshiradi. Boshqa foydalanuvchi uchun: sudo crontab -u ali -l. crontab -r jadvalni so'ramasdan to'liq o'chiradi: -e bilan yonma-yon bo'lgan bu klavishni adashtirmang.

2. Har 5 daqiqada ~/lab/jobs/tick.sh ni ishga tushiring.
Misol: */5 * * * * /home/student/lab/jobs/tick.sh

Yechim

*/5 * * * * /home/student/lab/jobs/tick.sh
Maydonlar: daqiqa, soat, oy kuni, oy, hafta kuni. */5 — "har 5 birlikda". Faylga chmod +x bering.

3. Har kuni soat 02:30 da zaxira skriptini ishga tushiring.
Misol: 30 2 * * * /usr/local/bin/backup.sh

Yechim

30 2 * * * /usr/local/bin/backup.sh
Birinchi maydon — daqiqa (30), ikkinchisi — soat (2). Odatiy xato — ularni almashtirib yuborish.

4. Dushanbadan jumagacha, 09:00 dan 18:00 gacha, har soat boshida ishga tushiring.
Misol: 0 9-18 * * 1-5 ...

Yechim

0 9-18 * * 1-5 /usr/local/bin/report.sh
Hafta kunlari: 0 va 7 — yakshanba, 1 — dushanba, 5 — juma.

5. Har oyning birinchi kuni yarim tunda ishga tushiring.
Misol: 0 0 1 * *

Yechim

0 0 1 * * /usr/local/bin/monthly.sh
Oy kuni va hafta kuni ikkalasi ham cheklangan bo'lsa (0 0 1 * 1), cron ularni "YOKI" bilan birlashtiradi, "VA" bilan emas.

6. Server qayta yoqilganda bir marta ishga tushadigan vazifa yozing.
Misol: @reboot.

Yechim
@reboot /home/student/lab/jobs/on-boot.sh

7. Vazifaning chiqishi (stdout va stderr) log faylga yozilsin.
Misol: ... >> /var/log/job.log 2>&1

Yechim

*/5 * * * * /home/student/lab/jobs/tick.sh >> /home/student/lab/jobs/tick.log 2>&1
Yo'naltirilmasa, cron chiqishni pochta orqali yuborishga urinadi (pochta serveri bo'lmasa, yo'qoladi): natijada vazifa "jim" yiqiladi.

8. Skript qo'lda ishlaydi, cron'da command not found beradi. Sababni va usulni ayting.
Misol: cron'ning PATH i qisqa.

Yechim

PATH=/usr/local/bin:/usr/bin:/bin
*/5 * * * * /usr/bin/python3 /opt/app/job.py >> /var/log/job.log 2>&1
Cron ~/.bashrc ni o'qimaydi va PATH odatda faqat /usr/bin:/bin. Jadval boshida PATH= o'rnating yoki dasturlarning to'liq yo'lini yozing. Muhitni tekshirish: vaqtincha * * * * * env > /tmp/cron-env.txt.

9. Cron qatorida date +%F ishlatganda nega xato bo'ladi? To'g'ri yozing.
Misol: \%F.

Yechim

0 1 * * * tar -czf /backup/data-$(date +\%F).tar.gz /srv/data
Crontab'da % — qator oxiri belgisi; undan keyingi matn buyruqqa stdin sifatida beriladi. Shu sabab % ni \% bilan qochirish kerak. Bu — cron vazifasi qo'lda ishlab, jadvalda yiqilishining klassik sababi.

10. Vazifa ishlamadi. Cron uni ishga tushirganini jurnaldan tekshiring.
Misol: CRON[1234]: (student) CMD (/home/student/lab/jobs/tick.sh)

Yechim

systemctl status cron
journalctl -u cron --since "1 hour ago"
grep CRON /var/log/syslog | tail
Jurnalda CMD qatori bor, lekin natija yo'q bo'lsa — cron skriptni ishga tushirgan, muammo skript ichida (PATH, ruxsat, yo'l). CMD qatori umuman yo'q bo'lsa — jadval xato, cron ishlamayapti yoki vaqt noto'g'ri. RHEL oilasida xizmat crond, log /var/log/cron.

11. Tizim uchun /etc/cron.d/ da vazifa yozing. Foydalanuvchi maydoni qayerda?
Misol: */10 * * * * root /usr/local/bin/clean.sh

Yechim

echo '*/10 * * * * root /usr/local/bin/clean.sh' | sudo tee /etc/cron.d/clean
sudo chmod 644 /etc/cron.d/clean
/etc/cron.d va /etc/crontab da beshta vaqt maydonidan keyin foydalanuvchi nomi (oltinchi maydon) yoziladi; shaxsiy crontab -e jadvalida bu maydon yo'q.

12. /etc/cron.daily/ ga skript qo'ydingiz, lekin ishlamayapti. Tekshiring.
Misol: fayl nomi backup.sh bo'lsa, o'tkazib yuboriladi.

Yechim

sudo cp backup.sh /etc/cron.daily/backup
sudo chmod 755 /etc/cron.daily/backup
run-parts --test /etc/cron.daily
run-parts nomida nuqta bor (.sh), bajarilmaydigan yoki noto'g'ri belgili fayllarni o'tkazib yuboradi. --test qaysilar ishga tushishini ko'rsatadi.

13. Vazifa 5 daqiqadan ko'proq davom etsa, uning ikkinchi nusxasi boshlanishini oldini oling.
Misol: ikkinchi ishga tushirish indamay chiqadi.

Yechim

*/5 * * * * flock -n /var/lock/job.lock /usr/local/bin/job.sh >> /var/log/job.log 2>&1
Aks holda sekin bo'lgan vazifa nusxalari to'planib, serverni ortiqcha yuklaydi.

14. ali foydalanuvchisiga cron'dan foydalanishni taqiqlang.
Misol: crontab -e → You (ali) are not allowed to use this program.

Yechim

echo ali | sudo tee -a /etc/cron.deny
/etc/cron.allow mavjud bo'lsa, faqat unda yozilganlar foydalana oladi (cron.deny e'tiborsiz qoladi). Shu sabab ruxsat ro'yxati (allow) xavfsizroq.

15. Cron vazifasini systemd timer bilan almashtiring: 02:30 da ishga tushsin va o'tkazib yuborilgan ishni keyin bajarsin. Cron'dan farqini ayting.
Misol: systemctl list-timers.

Yechim

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
sudo systemctl enable --now backup.timer
systemctl list-timers
journalctl -u backup.service
Timer'ning cron'dan afzalliklari: natija journalctl da, Persistent=true o'tkazib yuborilgan ishni bajaradi, xizmat bog'liqliklari va resurs cheklovlari qo'llanadi. Cron esa oddiy, hamma joyda bor va bir qatorda yoziladi.