Skip to content

4. Cron va vazifalarni rejalashtirish โ€‹

๐ŸŽฏ Bu bobda nimani o'rganasiz:

  • cron asoslari โ€” crontab, 5-maydon syntax
  • PATH muammosi โ€” bashning eng ko'p uchraydigan cron tuzog'i
  • at โ€” bir martalik kechiktirilgan vazifa
  • systemd timers โ€” zamonaviy muqobil
  • flock โ€” 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:

VazifaTipik vaqtVosita
Database backuphar kechacron / systemd
Log rotationhar kunlogrotate (cron)
SSL sertifikat yangilashoyiga 2 martacertbot (cron)
Cache tozalashhar 15 daqiqacron
Health check & alerthar 5 daqiqacron / monitor
Index rebuilddam olishlardacron

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 โ€‹

bash
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:

bash
crontab -l > ~/cron-backup-$(date +%F).txt

4.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 โ€‹

BelgiMa'nosiMisol
*har qiymat* * * * * โ€” har daqiqa
,ro'yxat0,15,30,45 * * * * โ€” 15 daqiqa'da bir
-diapazon9-17 โ€” soat 9 dan 17 gacha
/step*/5 โ€” har 5 daqiqada
*/Nstep bilan*/15 * * * *

Real misollar โ€‹

cron
# 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.sh

Maxsus stringlar โ€” @ โ€‹

StringEkvivalentMazmuni
@reboot(yuklanganda)Tizim yuklanganida bir marta
@yearly0 0 1 1 *Yilda bir marta
@monthly0 0 1 * *Oyda bir marta
@weekly0 0 * * 0Haftada bir (yakshanba)
@daily0 0 * * *Kuniga bir
@hourly0 * * * *Soatiga bir
cron
@reboot   /opt/startup.sh
@daily    /opt/backup.sh
@hourly   /opt/cleanup.sh

Crontab 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:

cron
# Sodda ko'rinadi, lekin xato:
* * * * * mybackup.sh
# cron: `mybackup` topilmadi (PATH'da yo'q)

Cron PATH default โ€‹

Aksariyat tizimda:

PATH=/usr/bin:/bin

Yo'q: /usr/local/bin, ~/bin, ~/.cargo/bin, ~/.local/bin va h.k.

Yechim โ€” 3 yo'l โ€‹

1. To'liq yo'l ishlatish (eng aniq):

cron
* * * * * /usr/local/bin/mybackup.sh

2. PATH'ni cron faylida o'rnatish:

cron
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash

* * * * * mybackup.sh

3. Skript boshida PATH yuklash:

bash
#!/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:

bash
* * * * * env > /tmp/cron-env.txt

Bir 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 โ€‹

cron
# 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>&1

MAILTO o'chirish

Mail tashvishidan qutilish uchun crontab boshida:

cron
MAILTO=""

0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1

Yoki aniq emailga:

cron
MAILTO="admin@example.com"

Tizim cron loglari โ€‹

bash
# Ubuntu / Debian
tail -f /var/log/syslog | grep CRON

# RHEL / CentOS
tail -f /var/log/cron

# macOS
log show --predicate 'process == "cron"' --last 1h

Skript debug rejimi โ€‹

bash
#!/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.

bash
# 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+D

Boshqaruv โ€‹

bash
atq           # kutilayotgan vazifalar
# 5    Sat May 17 18:00:00 2026 a ali

atrm 5        # bekor qilish

at -c 5       # ichidagi buyruqlarni ko'rish

Cron 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:

ini
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/opt/backup.sh
StandardOutput=journal
StandardError=journal

/etc/systemd/system/backup.timer:

ini
[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.target

Yoqish va boshqarish โ€‹

bash
# 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.service

OnCalendar= syntaxisi โ€‹

ini
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 olishlarda

systemd-analyze calendar

bash
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 +05

Buyurtma'ngiz to'g'riligini avval tekshiring.


4.8. cron vs systemd timers โ€” qiyosiy โ€‹

Xususiyatcronsystemd timer
Yosh19752010
Universal Unixโœ…โŒ (faqat systemd-li Linux)
macOS / *BSDโœ…โŒ
Logging integratsiyaqo'ldaโœ… journalctl
Missed run yetib olishโŒโœ… Persistent=true
Sandboxing (security)โŒโœ… to'liq
Resource limits (MemoryMax)โŒโœ…
Dependency'lar (boshqa service)โŒโœ… Requires=
Sodda holatlarโœ…overkill
Kompleks workflowqiyinโœ… tabiiy

Qoida

  • Bitta server, sodda vazifa โ†’ cron
  • Production xizmatlar โ†’ systemd timers
  • macOS โ†’ cron (yoki launchd)

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.

cron
* * * * * flock -n /tmp/myjob.lock /opt/myjob.sh

flock -n โ€” lock olib bo'lmasa, darhol chiqadi (xato bilan). Ikkinchi instance ishga tushmaydi.

Skript ichida โ€‹

bash
#!/usr/bin/env bash
exec 200>/var/run/myjob.lock
flock -n 200 || { echo "Allaqachon ishlamoqda"; exit 1; }

# ... asosiy ish ...

flock flag'lar โ€‹

FlagMazmuni
-nLock olib bo'lmasa darhol chiqish
-w <sec>N soniya kutib, keyin xato qaytarish
-xExclusive lock (default)
-sShared lock
-uUnlock (qo'lda)
cron
# 30s kutib, keyin xato bersa, log'ga yozib chiqarish
* * * * * flock -w 30 /tmp/myjob.lock /opt/myjob.sh >> /var/log/myjob.log 2>&1

4.10. Real misol โ€” Production-grade nightly backup โ€‹

bash
#!/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 โ€‹

cron
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.sh

Bu skript nima qiladi? โ€‹

XususiyatQaerda
Lock bilan single instancecrontab'da flock -n
Markaziy log fayliexec >> "$LOG_FILE" 2>&1
Slack notification (success+fail)notify_slack
Healthcheck.io pingcurl HEALTHCHECK_URL
Eski backup'larni avto-tozalashfind ... -mtime +N -delete
Trap orqali xato handletrap cleanup EXIT
Production-grade error reportingexit code โ†’ Slack alert

4.11. Tez-tez uchraydigan xatolar โ€‹

Klassik tuzoqlar

  1. PATH muammosi. Skript terminalda ishlaydi, cron'da yo'q. Yechim: to'liq yo'l yoki PATH=... crontab boshida.

  2. Output yo'qoladi. Default'da cron output mailga ketadi. Yechim: >> file 2>&1 har doim.

  3. MAILTO sozlanmagan, har daqiqa mail spam.MAILTO="" crontab boshida.

  4. Cron'da ~ ishlamaydi.~ interactive shell uchun. Cron'da $HOME yoki to'liq yo'l ishlating.

  5. crontab -r bilan adashish.-r = remove (hammasini). -e = edit. Tasodifan o'chirsangiz โ€” yo'qotdingiz.

  6. Time zone โ€” UTC vs local. Server odatda UTC'da. Yangi server'da timedatectl status bilan tekshiring.

  7. % belgisi cron'da maxsus. Cron qatorida % โ€” yangi qator. Aniq belgi kerak bo'lsa, escape qiling: \%. Yaxshiroq โ€” date +"%F" ni alohida skriptga o'tkazing.

  8. Single instance kafolati yo'q.flock ishlatmagan bo'lsangiz โ€” uzun ish 2 marta parallel ishlashi mumkin.

  9. macOS'da cron Full Disk Access. System Preferences โ†’ Security & Privacy โ†’ Full Disk Access โ€” cron qo'shing.

  10. Cron faylida xato yangilanish tushunmaslik.crontab -e orqali save qilganda โ€” darhol amal qiladi. Lekin SIGTERM yuborilmaydi: ishlovchi vazifa eski sintaksisni ishlatadi.


4.12. Mashqlar โ€‹

๐Ÿงช Kelajakda bashlings watch 14_cron paketida.

  1. 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-5
    • 0 0 1 * *
  2. Logging wrap โ€” quyidagi cron qatorni log + MAILTO bilan to'g'ri ko'rinishga keltiring:

    cron
    * * * * * mybackup.sh
  3. flock lock โ€” myjob.sh skripti uchun cron qatorida flock -n qo'shing va lock fayl /tmp/myjob.lock bo'lsin.

  4. at reminder โ€” 30 daqiqadan keyin "vaqti" deb chiqaruvchi at job yarating va atq orqali tekshiring.

  5. Systemd timer โ€” har 15 daqiqada ping qiluvchi myping.service va myping.timer faylini yozing.


4.13. Xulosa โ€‹

TushunchaAsosiy nuqta
crontab -eTahrirlash
crontab -lJoriy ro'yxat
crontab -rโš  HAMMASINI o'chirish
5 maydondaqiqa soat kun oy hafta-kuni
*/5Har 5 (step)
@daily, @hourlyMaxsus stringlar
0 2 * * *Har kun 02:00
>> log 2>&1Output har doim faylga
MAILTO=""Mail spam'ni o'chirish
PATH=...Cron'da o'rnatish majburiy
flock -n /tmp/x.lockSingle instance kafolati
at 18:00Bir martalik kechiktirish
OnCalendar=dailysystemd timer ekvivalenti
journalctl -u <service>systemd log'lar

5 ta asosiy g'oya โ€‹

  1. PATH cron'da minimal โ€” to'liq yo'l yoki crontab boshida PATH=....
  2. >> file 2>&1 har doim โ€” aks holda output yo'qoladi.
  3. flock -n โ€” har production cron qatorida.
  4. crontab.guru โ€” murakkab syntax'ni online tekshiring.
  5. 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 โ†’

MIT litsenziyasi asosida tarqatiladi.