Bash / Cron job үндэс

Cron job үндэс

Cron бол Linux-н хуваарийн систем юм. Тодорхой цаг, давтамжаар script ажиллуулахыг автоматаар хийж өгдөг. Өдөр бүр нөөцлөлт хийх, долоо хоног бүр тайлан гаргах, минут бүр сервер шалгах — бүгдийг cron хийнэ. Та нэг удаа тохируулчихвал компьютер өөрөө хийж байна.

Crontab — cron-н тохиргоо

Cron job-уудыг crontab файлд хадгалдаг. Засварлах:

bash
# Одоогийн хэрэглэгчийн crontab-г нээх
crontab -e

# Одоогийн crontab-г харах
crontab -l

# Crontab-г устгах
crontab -r

Crontab-г анх нээхэд текст засварлагч сонгох болно — nano сонгоход хамгийн хялбар.

Cron-н цагийн хэлбэр

код
* * * * * /path/to/script.sh
│ │ │ │ │
│ │ │ │ └── Гарагийн өдөр (0-7, 0 ба 7 = Ням)
│ │ │ └──── Сар (1-12)
│ │ └────── Сарын өдөр (1-31)
│ └──────── Цаг (0-23)
└────────── Минут (0-59)

* тэмдэг нь "бүр" гэсэн утгатай — тухайн байрт дурын утга байж болно гэсэн үг.

bash
# Жишээнүүд:
# Минут бүр
* * * * * /scripts/check.sh

# Өдөр бүр 02:30-д
30 2 * * * /scripts/backup.sh

# Долоо хоног бүр Даваа гарагт 09:00-д
0 9 * * 1 /scripts/weekly-report.sh

# Сар бүрийн 1-нд 00:00-д
0 0 1 * * /scripts/monthly-cleanup.sh

# Ажлын өдрүүдэд (Даваа-Баасан) 08:00-д
0 8 * * 1-5 /scripts/workday-start.sh

# Цаг бүр
0 * * * * /scripts/hourly-check.sh

# 5 минут бүр
*/5 * * * * /scripts/health-check.sh

Cron job бичих дадлага

Cron job ажиллуулахад terminal байдаггүй тул бүрэн зам (absolute path) ашиглах, гаралтыг файлд хадгалах шаардлагатай:

bash
# Буруу — харьцангуй зам, PATH байхгүй тул олдохгүй
* * * * * ./backup.sh

# Зөв — бүрэн зам, гаралтыг файлд хадгалдаг
* * * * * /home/batbold/scripts/backup.sh >> /var/log/backup.log 2>&1

Жишээ backup script:

bash
#!/bin/bash
# /home/batbold/scripts/backup.sh

set -euo pipefail

BACKUP_DIR="/backup/daily"
SOURCE_DIR="/var/www/myapp"
DATE=$(date +%Y-%m-%d)
LOG="/var/log/backup.log"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Нөөцлөлт эхэллээ" >> "$LOG"

# Директор байхгүй бол үүсгэх
mkdir -p "$BACKUP_DIR"

# Нөөцлөх
tar -czf "$BACKUP_DIR/backup-${DATE}.tar.gz" "$SOURCE_DIR"

# 30 хоногоос хуучин нөөцлөлтүүдийг устгах
find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +30 -delete

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Нөөцлөлт дууслаа" >> "$LOG"

Crontab-д нэмэх:

код
# Өдөр бүр шөнийн 03:00-д нөөцлөх
0 3 * * * /home/batbold/scripts/backup.sh >> /var/log/backup.log 2>&1

Cron job шалгах

bash
# Cron-н лог харах (Ubuntu/Debian)
grep CRON /var/log/syslog | tail -20

# Cron-н лог харах (CentOS/RHEL)
cat /var/log/cron | tail -20

# Cron ажиллаж байгаа эсэхийг шалгах
systemctl status cron     # Ubuntu/Debian
systemctl status crond    # CentOS/RHEL

Хэрэгтэй товчлолууд

bash
# crontab-д зарим системд эдгээр товчлолуудыг ашиглаж болно
@reboot    /scripts/startup.sh        # Систем асахад нэг удаа
@hourly    /scripts/check.sh          # Цаг бүр (= 0 * * * *)
@daily     /scripts/daily.sh          # Өдөр бүр (= 0 0 * * *)
@weekly    /scripts/weekly.sh         # 7 хоног бүр (= 0 0 * * 0)
@monthly   /scripts/monthly.sh        # Сар бүр (= 0 0 1 * *)

Cron job-уудыг туршихдаа эхлээд */1 * * * * (минут бүр) тохируулж ажиллаж байгааг нь баталгаажуулаад, дараа нь зөв цагт тохируулна. https://crontab.guru сайт нь cron илэрхийллийг шалгахад маш хэрэгтэй.

Дараагийн хичээлд:

Script debug хийх — set -x, bash -x, echo ашиглан script-ийн алдааг олж засах арга техникүүд.