Cron เป็นระบบ Job Scheduler มาตรฐานบน Linux ที่ช่วยให้รัน Script หรือคำสั่งโดยอัตโนมัติตามเวลาที่กำหนด ไม่ว่าจะเป็นทุกนาที ทุกชั่วโมง ทุกวัน ทุกสัปดาห์ หรือตาม Schedule ที่ซับซ้อนกว่านั้น Cron Jobs เป็นเครื่องมือสำคัญของ System Administrator สำหรับงาน Automation เช่น Backup, Log Rotation, Report Generation และ Maintenance Tasks
บทความนี้อธิบายการทำงานของ Cron ตั้งแต่ไวยากรณ์ของ Crontab, Special Strings, Environment Variables ไปจนถึง Best Practices สำหรับ Production Server
Cron Syntax — โครงสร้างไวยากรณ์
แต่ละบรรทัดใน Crontab ประกอบด้วย 5 ช่องเวลาตามด้วยคำสั่ง รูปแบบคือ
# ┌─────────── นาที (0–59)
# │ ┌─────────── ชั่วโมง (0–23)
# │ │ ┌─────────── วันในเดือน (1–31)
# │ │ │ ┌─────────── เดือน (1–12)
# │ │ │ │ ┌─────────── วันในสัปดาห์ (0–7, 0 และ 7 คือ อาทิตย์)
# │ │ │ │ │
# * * * * * command
ตัวอย่าง Cron Expression
# รันทุกนาที
* * * * * /path/to/script.sh
# รันทุกชั่วโมง (นาทีที่ 0)
0 * * * * /path/to/script.sh
# รันทุกวันเวลา 02:30
30 2 * * * /path/to/backup.sh
# รันทุกวันจันทร์เวลา 09:00
0 9 * * 1 /path/to/weekly-report.sh
# รันทุกวัน 1 และ 15 ของเดือน
0 0 1,15 * * /path/to/billing.sh
# รันทุก 5 นาที
*/5 * * * * /path/to/healthcheck.sh
# รันทุกวันจันทร์ถึงศุกร์ เวลา 08:00
0 8 * * 1-5 /path/to/weekday-task.sh
Special Strings — ทางลัดที่อ่านง่าย
Cron รองรับ Special String ที่อ่านง่ายกว่าการพิมพ์ 5 ช่องเวลา
@reboot — รันครั้งเดียวตอน Boot
@yearly — รันปีละครั้ง (เทียบเท่า 0 0 1 1 *)
@annually — เหมือน @yearly
@monthly — รันเดือนละครั้ง (เทียบเท่า 0 0 1 * *)
@weekly — รันสัปดาห์ละครั้ง (เทียบเท่า 0 0 * * 0)
@daily — รันวันละครั้ง (เทียบเท่า 0 0 * * *)
@midnight — เหมือน @daily
@hourly — รันทุกชั่วโมง (เทียบเท่า 0 * * * *)
# ตัวอย่าง
@reboot /home/deploy/start-app.sh
@daily /usr/local/bin/cleanup-logs.sh
จัดการ Crontab
# แก้ไข Crontab ของ User ปัจจุบัน
crontab -e
# ดู Crontab ของ User ปัจจุบัน
crontab -l
# ลบ Crontab ทั้งหมด
crontab -r
# แก้ไข Crontab ของ User อื่น (ต้องเป็น root)
sudo crontab -u www-data -e
sudo crontab -u deploy -l
System Crontab — /etc/crontab และ /etc/cron.d/
นอกจาก User Crontab แล้ว Linux ยังมี System-level Crontab ที่ระบุ User ที่รันได้ด้วย ซึ่งเหมาะสำหรับ Job ที่ต้องการสิทธิ์เฉพาะ
# /etc/crontab — System Crontab มีช่อง user เพิ่มเติม
# นาที ชั่วโมง วัน เดือน วันสัปดาห์ user command
30 2 * * * root /usr/local/bin/backup.sh
0 8 * * 1-5 deploy /opt/app/scripts/daily-report.sh
# /etc/cron.d/ — ไดเรกทอรีสำหรับ Package ต่าง ๆ
# ไฟล์ใน /etc/cron.d/ ใช้รูปแบบเดียวกับ /etc/crontab
ls /etc/cron.d/
Pre-configured Cron Directories
Linux มี Directory ที่กำหนด Schedule ไว้ล่วงหน้า สามารถวาง Script ลงไปได้โดยตรงโดยไม่ต้องแก้ไข Crontab
/etc/cron.hourly/ — รันทุกชั่วโมง
/etc/cron.daily/ — รันทุกวัน
/etc/cron.weekly/ — รันทุกสัปดาห์
/etc/cron.monthly/ — รันทุกเดือน
# วาง Script ลงใน Directory ที่ต้องการ (ไม่ต้องมี .sh Extension)
sudo cp myscript /etc/cron.daily/myscript
sudo chmod +x /etc/cron.daily/myscript
Output และ Log การรัน
โดยค่าเริ่มต้น Cron ส่ง Output ของ Job ผ่าน Email (ถ้าตั้งค่า Mail Server ไว้) หรือทิ้งไป การ Redirect Output ไปยัง Log File เป็น Best Practice
# Redirect stdout และ stderr ไปยัง Log File
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# ทิ้ง Output ทั้งหมด (ไม่ต้องการ Log)
*/5 * * * * /path/to/script.sh > /dev/null 2>&1
# เก็บเฉพาะ Error
0 * * * * /path/to/script.sh > /dev/null 2>> /var/log/script-errors.log
Environment Variables ใน Crontab
Cron ทำงานในสภาพแวดล้อมที่แตกต่างจาก Shell ปกติ PATH ที่ได้จะสั้นกว่ามาก ทำให้คำสั่งที่ไม่ใช้ Full Path อาจไม่ทำงาน แนะนำให้ตั้งค่า Environment Variables ไว้ต้น Crontab
# ตั้งค่า PATH และ Environment Variables ต้น Crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
[email protected]
# Job ต่าง ๆ
30 2 * * * backup.sh # ทำงานได้เพราะ PATH ครอบคลุม
0 9 * * * /usr/local/bin/report.sh # Full Path ปลอดภัยกว่าเสมอ
ดู Log การทำงานของ Cron
# Ubuntu/Debian — Log อยู่ใน syslog
grep CRON /var/log/syslog
grep CRON /var/log/syslog | tail -20
# RHEL/CentOS — Log อยู่ใน cron
cat /var/log/cron
tail -f /var/log/cron
# ดูผ่าน journalctl (systemd)
journalctl -u cron -n 50
journalctl -u crond -n 50 # RHEL/CentOS
Best Practices สำหรับ Production
- ใช้ Full Path เสมอ — ทั้งใน Command และใน Script เพราะ PATH ของ Cron แตกต่างจาก Interactive Shell เสมอ
- Redirect Output ทุก Job — ใช้
>> /var/log/jobname.log 2>&1เพื่อเก็บ Log และไม่ให้ Cron ส่ง Email โดยไม่ตั้งใจ - ทดสอบ Script ก่อน — รัน Script ด้วยมือใน Shell ก่อนใส่ใน Crontab เสมอ เพื่อตรวจสอบว่าไม่มี Error
- ใช้ Lock File ป้องกัน Overlap — ถ้า Job รันนานกว่า Interval ควรใช้ flock เพื่อป้องกันไม่ให้ Job ซ้อนกัน
- ระวัง Timezone — Cron ใช้ Timezone ของ System ตรวจสอบด้วย
timedatectlหรือdateก่อนตั้ง Schedule
ใช้ flock ป้องกัน Job ซ้อนกัน
# ป้องกัน Job รันซ้ำกันด้วย flock
*/5 * * * * flock -n /tmp/myjob.lock /usr/local/bin/myjob.sh
# flock จะ Skip การรัน ถ้า Lock ยังถูกถือโดย Instance ก่อนหน้า
# -n = non-blocking (ไม่รอ)
สรุป
Cron เป็น Job Scheduler หลักบน Linux ที่ใช้ Crontab Syntax 5 ช่องเวลาในการกำหนด Schedule Special String เช่น @daily และ @reboot ช่วยให้อ่านง่ายขึ้น การตั้งค่า PATH ใน Crontab, Redirect Output ไปยัง Log File และใช้ flock ป้องกัน Job ซ้อนกัน เป็น Best Practices สำคัญสำหรับ Production Server ระบบ /etc/cron.d/ และ Pre-configured Directory เช่น /etc/cron.daily/ ช่วยให้จัดการ System-level Job ได้สะดวกขึ้น
แนะนำบริการ DE
การตั้ง Cron Jobs สำหรับ Backup, Log Rotation หรือ Maintenance ต้องการ Server ที่มีสิทธิ์ root เต็มรูปแบบ Cloud VPS ของ DE ให้สิทธิ์ root สมบูรณ์ เหมาะสำหรับตั้งค่า Cron Jobs, Automated Backup และ Scheduled Maintenance Tasks บน Server จริง
หากต้องการโฮสต์เว็บไซต์โดยมี Cron Job จัดการให้อัตโนมัติ Cloud Hosting ของ DE รองรับ Cron Job ผ่าน Control Panel โดยไม่ต้องแก้ไข Crontab เอง

