⏰
Hosting

Cron ishlamayapti: 8 ta keng tarqalgan xato va ularni log orqali topish

12.11.2026
← Barcha maqolalar

Cron — serverda vazifalarni belgilangan vaqtda avtomatik bajaradigan rejalashtiruvchi. Hostingda u ko'pincha zaxira nusxa olish, xabarnomalar yuborish, valyuta kursini yangilash yoki eski fayllarni tozalash uchun ishlatiladi. Muammo shundaki, cron xato qilganda hech narsa demaydi: vazifa shunchaki bajarilmaydi va siz buni bir necha kundan keyin, natija yo'qligini ko'rganingizda bilasiz. Shuning uchun birinchi qoida oddiy — har bir cron vazifasining natijasini log faylga yozing, keyin quyidagi xatolarni birma-bir tekshiring.

Avval natijani log faylga yo'naltiring

Cron buyrug'i oxiriga chiqishni faylga yo'naltiruvchi qism qo'shilsa, skript nima deganini keyin o'qish mumkin bo'ladi. >> belgisi faylga qo'shib yozadi, 2>&1 esa xato xabarlarini ham shu faylga yuboradi. Usiz PHP'ning "Fatal error" xabari yoki "command not found" kabi tizim xabari yo'qolib ketadi.

*/15 * * * * /usr/bin/php /var/www/user/data/www/misol.uz/cron/kurs.php >> /var/www/user/data/logs/kurs.log 2>&1

Log fayl o'sib ketmasligi uchun uni vaqti-vaqti bilan tozalab turing yoki skript ichida faqat muhim qatorlarni yozing. Endi har bir xatoni ko'rib chiqamiz.

1. Nisbiy yo'l ishlatilgan

Skriptni brauzerda ochganingizda u o'z papkasida ishlaydi, cron esa uni foydalanuvchining uy katalogidan ishga tushiradi. Shu sababli skript ichidagi include 'config.php' yoki file_put_contents('data/out.txt', ...) kabi nisbiy yo'llar boshqa joyni ko'rsatadi va fayl topilmaydi. Yechim — PHP'da __DIR__ konstantasidan foydalanish yoki buyruqning o'zida avval papkaga o'tish.

*/15 * * * * cd /var/www/user/data/www/misol.uz && /usr/bin/php cron/kurs.php >> /var/www/user/data/logs/kurs.log 2>&1

2. Cron muhitida PATH qisqa

Terminalda ishlaydigan php, wp yoki composer buyruqlari cron ichida "command not found" berishi mumkin. Sababi — cron juda qisqa muhit o'zgaruvchilari bilan ishlaydi va sizning terminal sozlamalaringizni yuklamaydi. Har doim to'liq yo'lni yozing; uni terminalda which php buyrug'i bilan bilib olasiz.

3. Noto'g'ri PHP versiyasi

Hostingda bir nechta PHP versiyasi o'rnatilgan bo'lishi mumkin. Sayt panelda PHP 8.2 bilan ishlayapti, lekin cron'dagi oddiy php buyrug'i tizimning eski versiyasini chaqirsa, zamonaviy sintaksisli skript darhol "syntax error" beradi. Kerakli versiyaning aniq yo'lini ko'rsating va tekshiring:

/opt/php82/bin/php -v

Versiya yo'llari serverdan serverga farq qiladi, shuning uchun aniq yo'lni panel yoki texnik yordamdan aniqlang.

4. Bajarish ruxsati yo'q yoki qator oxiri buzilgan

Agar cron'da skriptni to'g'ridan-to'g'ri chaqirsangiz (masalan, /home/user/backup.sh), faylda bajarish ruxsati bo'lishi shart. Bundan tashqari, Windows'da tahrirlangan bash skript qator oxirida CRLF belgilarini saqlaydi va Linux uni "bad interpreter" xatosi bilan rad etadi.

chmod +x /home/user/backup.sh
sed -i 's/\r$//' /home/user/backup.sh

5. Foiz belgisi ekranlanmagan

Bu kam ma'lum, lekin juda ko'p uchraydigan xato. Crontab qatorida % belgisi yangi qator ma'nosini beradi, shuning uchun date +%Y-%m-%d kabi buyruq bo'lakka bo'linib ketadi. Har bir foiz belgisi oldiga teskari chiziq qo'ying: date +\%Y-\%m-\%d. Murakkab buyruqlarni esa alohida skript faylga chiqarish qulayroq.

6. Vaqt ifodasi noto'g'ri tushunilgan

Besh maydon tartibi: daqiqa, soat, oy kuni, oy, hafta kuni. * 3 * * * yozuvi "har kuni soat 3 da bir marta" emas, balki soat 3:00 dan 3:59 gacha har daqiqada ishga tushadi. To'g'ri variant — 0 3 * * *. Bundan tashqari, server vaqt mintaqasi Toshkent vaqtidan farq qilishi mumkin; buni date buyrug'i bilan tekshirib, jadvalni shunga moslang.

7. Vazifa o'zi bilan ustma-ust tushadi

Agar skript 10 daqiqa ishlasa-yu, har 5 daqiqada ishga tushirilsa, bir vaqtda bir nechta nusxa ishlay boshlaydi. Natijada bitta xabar ikki marta yuboriladi yoki bazada qulf (lock) xatolari paydo bo'ladi. flock buyrug'i oldingi nusxa tugamaguncha yangisini ishga tushirmaydi:

*/5 * * * * /usr/bin/flock -n /tmp/sms.lock /usr/bin/php /var/www/user/data/www/misol.uz/cron/sms.php >> /var/www/user/data/logs/sms.log 2>&1

8. Vaqt yoki xotira chegarasi

Katta eksport yoki zaxira skripti hosting tarifining xotira yoki protsessor chegarasiga urilib, yarmida to'xtashi mumkin. Logda "Allowed memory size exhausted" yoki "Killed" so'zlari ko'rinsa, ishni kichik bo'laklarga bo'ling: masalan, bir ishga tushishda 500 ta yozuvni qayta ishlang. Juda og'ir vazifalar uchun ularni tunda, sayt yuklamasi kam paytda rejalashtirish ham yordam beradi.

Amaliy misol: Toshkentdagi internet-do'kon

Kichik maishiy texnika do'koni har tunda soat 2 da mahsulot narxlarini dollar kursiga qarab yangilaydigan skript yozdi. Bir hafta davomida narxlar o'zgarmadi, panelda esa cron "faol" bo'lib turardi. Log yo'naltirish qo'shilgach, faylda "Failed opening required 'config.php'" xabari chiqdi — skript nisbiy yo'l bilan sozlamani qidirgan. Buyruq boshiga cd qo'shilgandan keyin keyingi kechasi skript ishladi, ammo endi "syntax error" chiqdi: cron eski PHP'ni chaqirayotgan edi. To'liq yo'l ko'rsatilgach, vazifa to'g'ri ishlay boshladi. Ikki xato ham faqat log tufayli 10 daqiqada topildi.

Skriptni cron sharoitida qo'lda sinash

Vazifani jadvalga qo'yishdan oldin uni cron muhitiga yaqin sharoitda sinab ko'ring. Quyidagi buyruq deyarli bo'sh muhit bilan ishga tushiradi va PATH yoki o'zgaruvchilarga bog'liq muammolarni darhol ko'rsatadi:

env -i /bin/sh -c 'cd /var/www/user/data/www/misol.uz && /usr/bin/php cron/kurs.php'

sayt.uz hostingida cron vazifalari ISPmanager panelining "Rejalashtiruvchi" bo'limida qo'shiladi, panelga esa sayt.uz kabinetidan kirasiz. Agar log bo'sh qolsa va vazifa umuman ishga tushmayotgandek ko'rinsa, texnik yordamga tiket yozib, buyruq qatorini yuboring — server tomonidagi cron logini tekshirish mumkin.

O'xshash maqolalar

🔐 .env faylini internetdan himoyalash: parollar sizib chiqmasligi uchun 🐧 VPS uchun operatsion tizim: Ubuntu, Debian yoki AlmaLinux 🖥️ Yangi VPS: birinchi 30 daqiqada qilinadigan ishlar 🚀 NestJS ilovasini production'ga chiqarish: build, PM2, Nginx va SSL
🌐 Til
🇺🇿 O'zbek ✓ 🇺🇿 Ўзбек 🇷🇺 Русский 🇬🇧 English