Cron job үндэс
Cron бол Linux-н хуваарийн систем юм. Тодорхой цаг, давтамжаар script ажиллуулахыг автоматаар хийж өгдөг. Өдөр бүр нөөцлөлт хийх, долоо хоног бүр тайлан гаргах, минут бүр сервер шалгах — бүгдийг cron хийнэ. Та нэг удаа тохируулчихвал компьютер өөрөө хийж байна.
Crontab — cron-н тохиргоо
Cron job-уудыг crontab файлд хадгалдаг. Засварлах:
# Одоогийн хэрэглэгчийн 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)
* тэмдэг нь "бүр" гэсэн утгатай — тухайн байрт дурын утга байж болно гэсэн үг.
# Жишээнүүд:
# Минут бүр
* * * * * /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) ашиглах, гаралтыг файлд хадгалах шаардлагатай:
# Буруу — харьцангуй зам, PATH байхгүй тул олдохгүй
* * * * * ./backup.sh
# Зөв — бүрэн зам, гаралтыг файлд хадгалдаг
* * * * * /home/batbold/scripts/backup.sh >> /var/log/backup.log 2>&1
Жишээ backup script:
#!/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 шалгах
# 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
Хэрэгтэй товчлолууд
# 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-ийн алдааг олж засах арга техникүүд.