4. Cron va vazifalarni rejalashtirish โ
๐ฏ Bu bobda nimani o'rganasiz:
cronasoslari โcrontab, 5-maydon syntax- PATH muammosi โ bashning eng ko'p uchraydigan cron tuzog'i
atโ bir martalik kechiktirilgan vazifasystemdtimers โ zamonaviy muqobilflockโ bir nusxa kafolati uchun production pattern- Real misol โ Nightly backup notification bilan
โฑ Vaqt: ~25 daqiqa ๐งช Mashqlar:
bashlings watch 14_cron(kelajak sprint)
4.1. Nima uchun rejalashtirish kerak? โ
Server'ning kundalik avtomatik ishlari:
| Vazifa | Tipik vaqt | Vosita |
|---|---|---|
| Database backup | har kecha | cron / systemd |
| Log rotation | har kun | logrotate (cron) |
| SSL sertifikat yangilash | oyiga 2 marta | certbot (cron) |
| Cache tozalash | har 15 daqiqa | cron |
| Health check & alert | har 5 daqiqa | cron / monitor |
| Index rebuild | dam olishlarda | cron |
Asosiy g'oya
Inson ishtirokisiz, ishonchli, doimiy bajariladigan har vazifa โ rejalashtirilgan vazifa. Mantra: "Agar oyiga ikkidan ko'p marta qilsang โ avtomatlashtir."
4.2. cron asoslari โ
cron โ Unix tizimlarining klassik scheduler'i (1975-yildan beri).
Asosiy buyruqlar โ
crontab -l # joriy ro'yxat
crontab -e # tahrirlash (default editor ochiladi)
crontab -r # โ HAMMASINI o'chirish โ diqqat!
crontab my.cron # fayldan import
crontab -u ali -l # boshqa foydalanuvchi cron'i (root sifatida)Joylashuvlar โ
~/ โ foydalanuvchi cron, `crontab -e` orqali
/var/spool/cron/<user> โ cron'lar shu yerda saqlanadi (root only)
/etc/crontab โ system-wide cron (user maydoni qo'shimcha)
/etc/cron.d/ โ qo'shimcha cron fayllar
/etc/cron.daily/ โ har kun ishga tushiriladigan skriptlar
/etc/cron.hourly/
/etc/cron.weekly/
/etc/cron.monthly/crontab -r โ diqqat!
-r flagi โ butun cron jadvalingizni so'rovsiz o'chiradi. -i flagi yo'q!
Backup qilib qo'ying:
crontab -l > ~/cron-backup-$(date +%F).txt4.3. Cron syntax โ 5 ta maydon โ
* * * * * buyruq
โ โ โ โ โ
โ โ โ โ โโโ hafta kuni (0-7, 0 va 7 = yakshanba)
โ โ โ โโโโโโ oy (1-12)
โ โ โโโโโโโโโ kun (1-31)
โ โโโโโโโโโโโโ soat (0-23)
โโโโโโโโโโโโโโโ daqiqa (0-59)Maxsus belgilar โ
| Belgi | Ma'nosi | Misol |
|---|---|---|
* | har qiymat | * * * * * โ har daqiqa |
, | ro'yxat | 0,15,30,45 * * * * โ 15 daqiqa'da bir |
- | diapazon | 9-17 โ soat 9 dan 17 gacha |
/ | step | */5 โ har 5 daqiqada |
*/N | step bilan | */15 * * * * |
Real misollar โ
# Har daqiqa
* * * * * /opt/heartbeat.sh
# Har 5 daqiqada
*/5 * * * * /opt/healthcheck.sh
# Har soat 0-daqiqasida
0 * * * * /opt/log-rotate.sh
# Har kun 02:00
0 2 * * * /opt/backup.sh
# Har yakshanba kecha 03:30
30 3 * * 0 /opt/weekly-report.sh
# Ish kuni 9-17 oraliqda har soat (1-5 = dushanba-juma)
0 9-17 * * 1-5 /opt/business-check.sh
# Har oyning 1-kunida 00:30
30 0 1 * * /opt/monthly-billing.sh
# Har 3 soatda
0 */3 * * * /opt/cache-refresh.sh
# Har 30 daqiqada, faqat ish kuni
*/30 * * * 1-5 /opt/sync.shMaxsus stringlar โ @ โ
| String | Ekvivalent | Mazmuni |
|---|---|---|
@reboot | (yuklanganda) | Tizim yuklanganida bir marta |
@yearly | 0 0 1 1 * | Yilda bir marta |
@monthly | 0 0 1 * * | Oyda bir marta |
@weekly | 0 0 * * 0 | Haftada bir (yakshanba) |
@daily | 0 0 * * * | Kuniga bir |
@hourly | 0 * * * * | Soatiga bir |
@reboot /opt/startup.sh
@daily /opt/backup.sh
@hourly /opt/cleanup.shCrontab generator
Murakkab sintaksis uchun โ crontab.guru โ interaktiv online tahlil. Ishonchli vosita.
4.4. Cron environment va PATH muammosi โ
Eng ko'p uchraydigan cron xato: "Skript terminalda ishlaydi, cron'da yo'q".
Sababi โ cron muhitida PATH minimal:
# Sodda ko'rinadi, lekin xato:
* * * * * mybackup.sh
# cron: `mybackup` topilmadi (PATH'da yo'q)Cron PATH default โ
Aksariyat tizimda:
PATH=/usr/bin:/binYo'q: /usr/local/bin, ~/bin, ~/.cargo/bin, ~/.local/bin va h.k.
Yechim โ 3 yo'l โ
1. To'liq yo'l ishlatish (eng aniq):
* * * * * /usr/local/bin/mybackup.sh2. PATH'ni cron faylida o'rnatish:
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
* * * * * mybackup.sh3. Skript boshida PATH yuklash:
#!/usr/bin/env bash
source ~/.bashrc # yoki aniq:
export PATH="/usr/local/bin:/usr/bin:/bin"
# ... ish ...Login shell vs Cron shell
Cron โ interactive bo'lmagan shell. ~/.bashrc'da [[ $- == *i* ]] && return bo'lsa, sozlamalar yuklanmaydi.
Test qilish:
* * * * * env > /tmp/cron-env.txtBir daqiqa kuting, keyin cat /tmp/cron-env.txt โ cron muhitini ko'rasiz.
4.5. Logging va debugging โ
Default'da cron output mail orqali foydalanuvchiga yuboriladi. Agar mail sozlanmagan bo'lsa โ yo'qoladi.
Yaxshi yo'l โ har doim faylga yo'naltirish โ
# Stdout va stderr ikkalasini bir faylga
0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
# Stdout va stderr alohida
0 2 * * * /opt/backup.sh > /var/log/backup.out 2>> /var/log/backup.err
# Hammasini yo'q qilish (umuman istamasangiz)
0 2 * * * /opt/silent.sh > /dev/null 2>&1MAILTO o'chirish
Mail tashvishidan qutilish uchun crontab boshida:
MAILTO=""
0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1Yoki aniq emailga:
MAILTO="admin@example.com"Tizim cron loglari โ
# Ubuntu / Debian
tail -f /var/log/syslog | grep CRON
# RHEL / CentOS
tail -f /var/log/cron
# macOS
log show --predicate 'process == "cron"' --last 1hSkript debug rejimi โ
#!/usr/bin/env bash
set -euo pipefail
# Cron'da ishlasa, log'ga yozish
exec >> /var/log/myscript.log 2>&1
echo "===== $(date) ====="
# ... asosiy ish ...exec >> file 2>&1 โ skriptning butun keyingi chiqishini faylga yo'naltiradi.
4.6. at โ bir martalik kechiktirilgan vazifa โ
cron โ takroriy. at โ bitta marta kelajakdagi vaqtda bajarish.
# Bugun 18:00 da
echo "/opt/notify.sh" | at 18:00
# Ertaga
echo "/opt/task.sh" | at 09:00 tomorrow
# 1 soatdan keyin
echo "/opt/reminder.sh" | at now + 1 hour
# Aniq sana
echo "/opt/event.sh" | at 14:30 2026-06-01
# Interaktiv (ko'p qator)
at 22:00
> notify-send "Vaqt boldi"
> /opt/cleanup.sh
> Ctrl+DBoshqaruv โ
atq # kutilayotgan vazifalar
# 5 Sat May 17 18:00:00 2026 a ali
atrm 5 # bekor qilish
at -c 5 # ichidagi buyruqlarni ko'rishCron vs at โ qachon qaysi
- Cron โ takroriy: backup, monitoring, cleanup
atโ bir martalik: "ertaga ertalab serverni qayta yuklash"
4.7. systemd timers โ zamonaviy muqobil โ
Modern Linux distributivlarida systemd mavjud โ cron'dan ko'p afzalliklarga ega.
Tuzilish โ .service + .timer โ
/etc/systemd/system/backup.service:
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/opt/backup.sh
StandardOutput=journal
StandardError=journal/etc/systemd/system/backup.timer:
[Unit]
Description=Nightly backup timer
Requires=backup.service
[Timer]
OnCalendar=daily # = soat 00:00
OnCalendar=*-*-* 02:00:00 # aniq 02:00
Persistent=true # missed run'ni yetib olish
RandomizedDelaySec=30m # 0-30 daqiqa tasodifiy kechiktirish
[Install]
WantedBy=timers.targetYoqish va boshqarish โ
# Reload (yangi fayl qo'shgandan keyin)
sudo systemctl daemon-reload
# Yoqish va boshlash
sudo systemctl enable --now backup.timer
# Status
systemctl status backup.timer
systemctl list-timers --all
# Loglar
journalctl -u backup.service # service log
journalctl -u backup.service --since "1 hour ago"
# Manual ishga tushirish (test)
sudo systemctl start backup.serviceOnCalendar= syntaxisi โ
OnCalendar=hourly # har soat
OnCalendar=daily # har kun 00:00
OnCalendar=weekly # har yakshanba
OnCalendar=monthly # har oyning 1-kuni
OnCalendar=Mon..Fri 09:00 # ish kuni 9:00
OnCalendar=*-*-* 02:00:00 # har kun 02:00
OnCalendar=*:0/15 # har 15 daqiqada
OnCalendar=Sat,Sun 04:00 # dam olishlardasystemd-analyze calendar
systemd-analyze calendar "Mon..Fri 09:00"
# Original form: Mon..Fri 09:00
# Normalized form: Mon..Fri *-*-* 09:00:00
# Next elapse: Mon 2026-05-19 09:00:00 +05Buyurtma'ngiz to'g'riligini avval tekshiring.
4.8. cron vs systemd timers โ qiyosiy โ
| Xususiyat | cron | systemd timer |
|---|---|---|
| Yosh | 1975 | 2010 |
| Universal Unix | โ | โ (faqat systemd-li Linux) |
| macOS / *BSD | โ | โ |
| Logging integratsiya | qo'lda | โ journalctl |
| Missed run yetib olish | โ | โ
Persistent=true |
| Sandboxing (security) | โ | โ to'liq |
Resource limits (MemoryMax) | โ | โ |
| Dependency'lar (boshqa service) | โ | โ
Requires= |
| Sodda holatlar | โ | overkill |
| Kompleks workflow | qiyin | โ tabiiy |
Qoida
- Bitta server, sodda vazifa โ
cron - Production xizmatlar โ
systemdtimers - macOS โ
cron(yokilaunchd)
macOS โ launchd
macOS'da cron rasmiy deprecated (lekin hali ishlaydi). Tavsiya etilgan vosita โ launchd (.plist fayllar ~/Library/LaunchAgents/).
Sodda holatlar uchun cron ishlatish mumkin. Lekin macOS'da cron ba'zan Full Disk Access ruxsatisiz ishlamaydi โ System Preferences orqali berishingiz kerak bo'lishi mumkin.
4.9. flock โ bir nusxa kafolati โ
Eng klassik cron muammo: skript 1 daqiqada bajarilishi kerak, lekin 2 daqiqa ishlamoqda. Keyingi tick'da yana ishga tushadi โ ikki nusxa parallel. Disk yoki database ustida poyga.
Yechim: flock bilan lock fayl.
* * * * * flock -n /tmp/myjob.lock /opt/myjob.shflock -n โ lock olib bo'lmasa, darhol chiqadi (xato bilan). Ikkinchi instance ishga tushmaydi.
Skript ichida โ
#!/usr/bin/env bash
exec 200>/var/run/myjob.lock
flock -n 200 || { echo "Allaqachon ishlamoqda"; exit 1; }
# ... asosiy ish ...flock flag'lar โ
| Flag | Mazmuni |
|---|---|
-n | Lock olib bo'lmasa darhol chiqish |
-w <sec> | N soniya kutib, keyin xato qaytarish |
-x | Exclusive lock (default) |
-s | Shared lock |
-u | Unlock (qo'lda) |
# 30s kutib, keyin xato bersa, log'ga yozib chiqarish
* * * * * flock -w 30 /tmp/myjob.lock /opt/myjob.sh >> /var/log/myjob.log 2>&14.10. Real misol โ Production-grade nightly backup โ
#!/usr/bin/env bash
#
# nightly-backup.sh โ production backup with notifications
#
# crontab entry:
# 0 2 * * * flock -n /tmp/backup.lock /opt/bin/nightly-backup.sh
#
set -euo pipefail
IFS=$'\n\t'
# === Konfiguratsiya ===
readonly SCRIPT_NAME="$(basename "$0")"
readonly LOG_FILE="/var/log/backup.log"
readonly SLACK_WEBHOOK="${SLACK_WEBHOOK:-}"
readonly HEALTHCHECK_URL="${HEALTHCHECK_URL:-}"
readonly BACKUP_DIR="/var/backups"
readonly SOURCE_DIRS=("/var/www" "/etc")
readonly KEEP_DAYS=14
# === Logging ===
exec >> "$LOG_FILE" 2>&1
echo ""
echo "===== $(date '+%Y-%m-%d %H:%M:%S') ====="
log() { printf '[%s] %s\n' "$(date '+%H:%M:%S')" "$*"; }
# === Notification ===
notify_slack() {
[[ -z "$SLACK_WEBHOOK" ]] && return 0
local msg="$1"
curl -fsS -X POST -H 'Content-Type: application/json' \
-d "{\"text\":\"$msg\"}" \
"$SLACK_WEBHOOK" > /dev/null
}
# === Cleanup va xato handling ===
cleanup() {
local rc=$?
if [[ $rc -ne 0 ]]; then
log "โ Backup xato bilan tugadi (exit=$rc)"
notify_slack ":x: Backup failed on $(hostname) (exit=$rc, see $LOG_FILE)"
fi
}
trap cleanup EXIT
# === Asosiy ish ===
log "๐ฆ Backup boshlandi"
mkdir -p "$BACKUP_DIR"
archive="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).tar.gz"
log "๐ Arxiv: $archive"
if ! tar -czf "$archive" "${SOURCE_DIRS[@]}" 2>&1; then
log "โ tar yiqildi"
exit 1
fi
size=$(du -sh "$archive" | cut -f1)
log "โ
Arxiv tayyor: $size"
# === Eski backup'larni tozalash ===
log "๐งน ${KEEP_DAYS} kundan eski'larni o'chirish..."
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime "+$KEEP_DAYS" -delete
# === Healthcheck ping ===
if [[ -n "$HEALTHCHECK_URL" ]]; then
curl -fsS --max-time 10 "$HEALTHCHECK_URL" > /dev/null \
&& log "๐ Healthcheck ping yuborildi"
fi
# === Success notification ===
notify_slack ":white_check_mark: Backup OK on $(hostname) โ size: $size"
log "๐ Yakunlandi"Crontab entry โ
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=""
SLACK_WEBHOOK=https://hooks.slack.com/services/...
HEALTHCHECK_URL=https://hc-ping.com/uuid-here
# Har kun 02:00 โ lock bilan, single instance
0 2 * * * flock -n /tmp/backup.lock /opt/bin/nightly-backup.shBu skript nima qiladi? โ
| Xususiyat | Qaerda |
|---|---|
| Lock bilan single instance | crontab'da flock -n |
| Markaziy log fayli | exec >> "$LOG_FILE" 2>&1 |
| Slack notification (success+fail) | notify_slack |
| Healthcheck.io ping | curl HEALTHCHECK_URL |
| Eski backup'larni avto-tozalash | find ... -mtime +N -delete |
| Trap orqali xato handle | trap cleanup EXIT |
| Production-grade error reporting | exit code โ Slack alert |
4.11. Tez-tez uchraydigan xatolar โ
Klassik tuzoqlar
PATH muammosi. Skript terminalda ishlaydi, cron'da yo'q. Yechim: to'liq yo'l yoki
PATH=...crontab boshida.Output yo'qoladi. Default'da cron output mailga ketadi. Yechim:
>> file 2>&1har doim.MAILTOsozlanmagan, har daqiqa mail spam.MAILTO=""crontab boshida.Cron'da
~ishlamaydi.~interactive shell uchun. Cron'da$HOMEyoki to'liq yo'l ishlating.crontab -rbilan adashish.-r= remove (hammasini).-e= edit. Tasodifan o'chirsangiz โ yo'qotdingiz.Time zone โ UTC vs local. Server odatda UTC'da. Yangi server'da
timedatectl statusbilan tekshiring.%belgisi cron'da maxsus. Cron qatorida%โ yangi qator. Aniq belgi kerak bo'lsa, escape qiling:\%. Yaxshiroq โdate +"%F"ni alohida skriptga o'tkazing.Single instance kafolati yo'q.
flockishlatmagan bo'lsangiz โ uzun ish 2 marta parallel ishlashi mumkin.macOS'da cron Full Disk Access. System Preferences โ Security & Privacy โ Full Disk Access โ
cronqo'shing.Cron faylida xato yangilanish tushunmaslik.
crontab -eorqali save qilganda โ darhol amal qiladi. Lekin SIGTERM yuborilmaydi: ishlovchi vazifa eski sintaksisni ishlatadi.
4.12. Mashqlar โ
๐งช Kelajakda
bashlings watch 14_cronpaketida.
Cron syntax parser โ quyidagi cron qatorlarini "har soat 30-daqiqasi" yoki "ish kuni 9-17 har 30 daqiqa" deb tushuntirish bo'yicha quiz:
30 * * * **/30 9-17 * * 1-50 0 1 * *
Logging wrap โ quyidagi cron qatorni log + MAILTO bilan to'g'ri ko'rinishga keltiring:
cron* * * * * mybackup.shflocklock โmyjob.shskripti uchun cron qatoridaflock -nqo'shing va lock fayl/tmp/myjob.lockbo'lsin.atreminder โ 30 daqiqadan keyin "vaqti" deb chiqaruvchiatjob yarating vaatqorqali tekshiring.Systemd timer โ har 15 daqiqada ping qiluvchi
myping.servicevamyping.timerfaylini yozing.
4.13. Xulosa โ
| Tushuncha | Asosiy nuqta |
|---|---|
crontab -e | Tahrirlash |
crontab -l | Joriy ro'yxat |
crontab -r | โ HAMMASINI o'chirish |
| 5 maydon | daqiqa soat kun oy hafta-kuni |
*/5 | Har 5 (step) |
@daily, @hourly | Maxsus stringlar |
0 2 * * * | Har kun 02:00 |
>> log 2>&1 | Output har doim faylga |
MAILTO="" | Mail spam'ni o'chirish |
PATH=... | Cron'da o'rnatish majburiy |
flock -n /tmp/x.lock | Single instance kafolati |
at 18:00 | Bir martalik kechiktirish |
OnCalendar=daily | systemd timer ekvivalenti |
journalctl -u <service> | systemd log'lar |
5 ta asosiy g'oya โ
- PATH cron'da minimal โ to'liq yo'l yoki crontab boshida
PATH=.... >> file 2>&1har doim โ aks holda output yo'qoladi.flock -nโ har production cron qatorida.crontab.guruโ murakkab syntax'ni online tekshiring.systemd timerโ Linux'da production uchun afzal (logging + sandboxing + missed-run catch-up).
๐ Endi siz vazifalarni avtomatlashtira olasiz. Keyingi bobda โ Docker orqali konteynerlar bilan ishlash.
Keyingi sahifa: 5. Docker bilan integratsiya โ