
Cron Job คืออะไร?
Cron คือ Job Scheduler บน Linux/Unix ที่ช่วยให้ SysAdmin ตั้งเวลาให้คำสั่งหรือ Script ทำงานอัตโนมัติ ไม่ว่าจะเป็นทุกนาที ทุกชั่วโมง ทุกวัน หรือทุกเดือน Cron เป็นเครื่องมือพื้นฐานที่ทุก SysAdmin ต้องรู้และใช้งานได้อย่างชำนาญ
Cron Syntax — โครงสร้างคำสั่ง
# =============================================
# Cron Expression Format:
# =============================================
# ┌───────────── นาที (0-59)
# │ ┌─────────── ชั่วโมง (0-23)
# │ │ ┌───────── วันในเดือน (1-31)
# │ │ │ ┌─────── เดือน (1-12)
# │ │ │ │ ┌───── วันในสัปดาห์ (0-7, 0 และ 7 = อาทิตย์)
# │ │ │ │ │
# * * * * * command
#
# ตัวอย่าง:
# 30 2 * * * → ทุกวัน เวลา 02:30
# 0 */6 * * * → ทุก 6 ชั่วโมง
# 0 0 1 * * → วันที่ 1 ของทุกเดือน เที่ยงคืน
# */5 * * * * → ทุก 5 นาที
# 0 9 * * 1-5 → จันทร์-ศุกร์ เวลา 09:00
# 0 0 * * 0 → ทุกวันอาทิตย์ เที่ยงคืน
#
# Special Characters:
# * = ทุกค่า
# */N = ทุก N (เช่น */5 = ทุก 5 นาที)
# N-M = ช่วง (เช่น 1-5 = จันทร์ถึงศุกร์)
# N,M = เฉพาะ (เช่น 1,15 = วันที่ 1 และ 15)
คำสั่ง Crontab พื้นฐาน
# ดู Crontab ของ User ปัจจุบัน:
crontab -l
# แก้ไข Crontab:
crontab -e
# ลบ Crontab ทั้งหมด (ระวัง!):
crontab -r
# ดู Crontab ของ User อื่น (ต้อง root):
sudo crontab -u username -l
# System Crontab:
sudo cat /etc/crontab
# Cron directories (สำหรับ Scripts):
ls /etc/cron.daily/ # ทำงานทุกวัน
ls /etc/cron.weekly/ # ทำงานทุกสัปดาห์
ls /etc/cron.monthly/ # ทำงานทุกเดือน
ls /etc/cron.hourly/ # ทำงานทุกชั่วโมง
ตัวอย่าง Cron Jobs ที่ SysAdmin ใช้บ่อย
# =============================================
# 1. Backup Database ทุกวัน เวลา 02:00:
# =============================================
0 2 * * * /usr/local/bin/backup-db.sh >> /var/log/backup.log 2>&1
# Script backup-db.sh:
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -u root -p'password' --all-databases | gzip > /backup/db_$DATE.sql.gz
find /backup -name "db_*.sql.gz" -mtime +30 -delete
# =============================================
# 2. ตรวจสอบ Disk Space ทุก 6 ชั่วโมง:
# =============================================
0 */6 * * * /usr/local/bin/check-disk.sh
# Script check-disk.sh:
#!/bin/bash
THRESHOLD=90
USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "ALERT: Disk usage is $USAGE%" | mail -s "Disk Alert" [email protected]
fi
# =============================================
# 3. Renew SSL Certificate (Let's Encrypt):
# =============================================
0 3 1 */2 * certbot renew --quiet >> /var/log/certbot-renew.log 2>&1
# =============================================
# 4. Clear Temp Files ทุกวัน:
# =============================================
0 4 * * * find /tmp -type f -mtime +7 -delete
# =============================================
# 5. Sync Files ระหว่าง Server:
# =============================================
*/30 * * * * rsync -avz --delete /data/ backup-server:/data/ >> /var/log/rsync.log 2>&1
# =============================================
# 6. Monitor Service:
# =============================================
*/5 * * * * systemctl is-active --quiet nginx || systemctl restart nginx
# =============================================
# 7. Log Rotation:
# =============================================
0 0 * * * /usr/local/bin/rotate-logs.sh
# =============================================
# 8. Report สรุปรายวัน:
# =============================================
0 8 * * 1-5 /usr/local/bin/daily-report.sh | mail -s "Daily Report" [email protected]
Cron Environment Variables
# =============================================
# Cron ทำงานใน Environment ที่จำกัด:
# =============================================
#
# ปัญหาที่พบบ่อย:
# → Script ทำงานบน Terminal ได้ แต่ Cron ไม่ทำงาน
# → เพราะ Cron ไม่ได้โหลด .bashrc/.profile
# → PATH ใน Cron มีน้อยมาก
#
# วิธีแก้ 1: ใส่ PATH เต็มใน Crontab:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 2 * * * /usr/local/bin/backup.sh
# วิธีแก้ 2: ใส่ Full Path ในคำสั่ง:
0 2 * * * /usr/bin/python3 /home/user/script.py
# วิธีแก้ 3: Source Profile ก่อน:
0 2 * * * source /home/user/.profile && /home/user/script.sh
# ตั้งค่า SHELL:
SHELL=/bin/bash
[email protected]
# ตรวจสอบ Cron Environment:
* * * * * env > /tmp/cron-env.txt
# → รันครั้งเดียวแล้วลบออก
Cron Logging และ Debug
# =============================================
# ดู Cron Log:
# =============================================
# Ubuntu/Debian:
grep CRON /var/log/syslog
# CentOS/RHEL:
cat /var/log/cron
# ดู Cron Log แบบ Real-time:
tail -f /var/log/syslog | grep CRON
# =============================================
# Debug Cron Job:
# =============================================
#
# 1. Redirect Output ไป Log:
0 2 * * * /path/script.sh >> /var/log/myjob.log 2>&1
# → >> = Append
# → 2>&1 = stderr ไปที่ stdout ด้วย
#
# 2. ส่ง Email เมื่อมี Error:
[email protected]
0 2 * * * /path/script.sh
# → ถ้ามี Output จะส่ง Email
#
# 3. ทดสอบ Script ด้วยมือก่อน:
sudo -u crontab-user /path/script.sh
# → ทดสอบด้วย User เดียวกับ Cron
#
# 4. ตรวจสอบ Permission:
ls -la /path/script.sh
# → ต้องมี +x (executable)
chmod +x /path/script.sh
Systemd Timer — ทางเลือกของ Cron
# =============================================
# Systemd Timer (Modern Alternative):
# =============================================
#
# ข้อดีเหนือ Cron:
# → ดู Log ง่าย (journalctl)
# → จัดการ Dependencies ได้
# → Retry เมื่อ Fail
# → Calendar Events ยืดหยุ่นกว่า
#
# ตัวอย่าง: backup.timer
# /etc/systemd/system/backup.timer:
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service:
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=root
# เปิดใช้งาน:
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
# ดู Timer ทั้งหมด:
systemctl list-timers --all
# ดู Log:
journalctl -u backup.service
Best Practices
| Practice | คำอธิบาย |
|---|---|
| Log ทุกอย่าง | Redirect output ไป log file เสมอ |
| ใช้ Full Path | ทั้งคำสั่งและ Script ใช้ Absolute Path |
| Lock File | ป้องกัน Script รันซ้อนกัน |
| Error Notification | แจ้งเตือนเมื่อ Job Fail |
| Test ก่อน Deploy | ทดสอบ Script ด้วยมือก่อนใส่ Cron |
| Comment ชัดเจน | ใส่ Comment อธิบายว่า Job ทำอะไร |
| Backup Crontab | crontab -l > crontab-backup.txt |
สรุป: Cron Job สำหรับ SysAdmin
Cron เป็นเครื่องมือ Automation พื้นฐานที่ทุก SysAdmin ต้องรู้ ใช้จัดตาราง Backup, Monitoring, Cleanup และงาน Routine อื่นๆ เข้าใจ Cron Syntax ให้ดี ใช้ Full Path เสมอ Log ทุกอย่าง และทดสอบก่อน Deploy คุณจะประหยัดเวลาได้มหาศาลจากงาน Automation ที่ดี