9. cron va avtomatlashtirish — 15 ta masala
Cron vazifalarini sinash uchun avval ~/lab/jobs katalogini yarating:
1. Joriy foydalanuvchining cron jadvalini ko'ring va tahrirlang.
Misol: no crontab for student (hali yo'q bo'lsa).
Yechim
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
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
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
Hafta kunlari:0 va 7 — yakshanba, 1 — dushanba, 5 — juma.
5. Har oyning birinchi kuni yarim tunda ishga tushiring.
Misol: 0 0 1 * *
Yechim
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.
7. Vazifaning chiqishi (stdout va stderr) log faylga yozilsin.
Misol: ... >> /var/log/job.log 2>&1
Yechim
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
~/.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
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
JurnaldaCMD 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
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
/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
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.