Cron Jobs ตัวช่วยจัดการเซิร์ฟเวอร์อัตโนมัติที่ทุกคนต้องรู้
ลองนึกภาพว่าต้อง Backup ฐานข้อมูลทุกวันตอนตี 2 ล้าง Log ทุกสัปดาห์ และต่ออายุ SSL Certificate ทุกเดือน ถ้าทำมือทุกอย่าง คงเหนื่อยไม่ไหว Cron คือเครื่องมือตั้งเวลาอัตโนมัติบน Linux ที่ช่วยรันคำสั่งหรือสคริปต์ตามเวลาที่กำหนดโดยไม่ต้องนั่งเฝ้า
สำหรับผู้ดูแล VPS หรือ Dedicated Server ของ DriteStudio การใช้ Cron Jobs อย่างมีประสิทธิภาพช่วยลดภาระงาน Routine ได้อย่างมหาศาล
ทำความเข้าใจ Cron Expression
โครงสร้างพื้นฐาน
Cron Expression มี 5 ฟิลด์ เรียงจากซ้ายไปขวา
┌───────────── นาที (0-59)
│ ┌───────────── ชั่วโมง (0-23)
│ │ ┌───────────── วันของเดือน (1-31)
│ │ │ ┌───────────── เดือน (1-12)
│ │ │ │ ┌───────────── วันของสัปดาห์ (0-7, 0 และ 7 = อาทิตย์)
│ │ │ │ │
* * * * * คำสั่งที่ต้องการรัน
ตัวอย่าง Cron Expression ที่ใช้บ่อย
# ทุก 5 นาที
*/5 * * * * /path/to/script.sh
# ทุกชั่วโมง ตรง
0 * * * * /path/to/script.sh
# ทุกวัน ตอนตี 2
0 2 * * * /path/to/script.sh
# ทุกวันจันทร์ถึงศุกร์ ตอน 9 โมงเช้า
0 9 * * 1-5 /path/to/script.sh
# ทุกวันอาทิตย์ ตอนตี 3
0 3 * * 0 /path/to/script.sh
# วันที่ 1 ของทุกเดือน ตอนเที่ยงคืน
0 0 1 * * /path/to/script.sh
# ทุก 30 นาที ในช่วง 9:00-18:00 วันจันทร์ถึงศุกร์
*/30 9-18 * * 1-5 /path/to/script.sh
สัญลักษณ์พิเศษ
เครื่องหมาย * หมายถึงทุกค่า, / ใช้กำหนดช่วง เช่น */5 หมายถึงทุก 5 หน่วย, เครื่องหมาย , แยกค่าหลายค่า เช่น 1,3,5 และ - กำหนดช่วง เช่น 1-5 หมายถึงจันทร์ถึงศุกร์
Shortcut ที่ใช้บ่อย
@reboot # รันเมื่อเซิร์ฟเวอร์เริ่มทำงาน
@hourly # รันทุกชั่วโมง (เทียบเท่า 0 * * * *)
@daily # รันวันละครั้ง (เทียบเท่า 0 0 * * *)
@weekly # รันสัปดาห์ละครั้ง (เทียบเท่า 0 0 * * 0)
@monthly # รันเดือนละครั้ง (เทียบเท่า 0 0 1 * *)
วิธีตั้งค่า Cron Jobs
จัดการ Crontab
# แก้ไข Cron Jobs ของ User ปัจจุบัน
crontab -e
# ดูรายการ Cron Jobs ทั้งหมดของ User ปัจจุบัน
crontab -l
# ดู Cron Jobs ของ User อื่น (ต้อง root)
sudo crontab -l -u www-data
# ลบ Cron Jobs ทั้งหมด (ระวัง!)
crontab -r
ใช้ไฟล์ใน /etc/cron.d/
สำหรับ System-level Cron Jobs สร้างไฟล์ใน /etc/cron.d/ รูปแบบคล้าย crontab แต่เพิ่มฟิลด์ Username
# สร้างไฟล์ System Cron Job
sudo nano /etc/cron.d/backup-job
ตัวอย่างเนื้อหาในไฟล์
# Backup ทุกวันตี 2 ด้วย User root
0 2 * * * root /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
ใช้โฟลเดอร์สำเร็จรูป
Linux มีโฟลเดอร์สำหรับรันอัตโนมัติ แค่วางสคริปต์ลงไป
/etc/cron.hourly/ # รันทุกชั่วโมง
/etc/cron.daily/ # รันทุกวัน
/etc/cron.weekly/ # รันทุกสัปดาห์
/etc/cron.monthly/ # รันทุกเดือน
# วางสคริปต์และเพิ่มสิทธิ์ Execute
sudo cp backup.sh /etc/cron.daily/
sudo chmod +x /etc/cron.daily/backup.sh
ตัวอย่าง Cron Jobs ที่ใช้บ่อย
Backup ฐานข้อมูลรายวัน
# Backup MySQL ทุกวันตี 2
0 2 * * * /usr/bin/mysqldump -u root -pYourPassword dbname | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz 2>> /var/log/backup.log
# Backup PostgreSQL ทุกวันตี 3
0 3 * * * /usr/bin/pg_dump -U postgres dbname | gzip > /backup/pg_$(date +\%Y\%m\%d).sql.gz 2>> /var/log/backup.log
สำหรับเซิร์ฟเวอร์ที่ใช้โฮสติ้งของ DriteStudio การตั้ง Backup อัตโนมัติเป็นสิ่งจำเป็น
ล้าง Log Files อัตโนมัติ
# ลบ Log ที่เก่าเกิน 30 วัน ทุกวันอาทิตย์ตี 4
0 4 * * 0 /usr/bin/find /var/log -name "*.log" -mtime +30 -delete >> /var/log/cleanup.log 2>&1
ต่ออายุ SSL Certificate
# รัน certbot renew ทุกวันตอนตี 3 และ Reload Nginx ถ้าต่ออายุสำเร็จ
0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx" >> /var/log/certbot.log 2>&1
ตรวจสอบสถานะบริการ
# เช็คว่า Nginx ทำงานอยู่ไหม ทุก 5 นาที ถ้าหยุดก็รีสตาร์ท
*/5 * * * * systemctl is-active --quiet nginx || systemctl restart nginx >> /var/log/nginx-watchdog.log 2>&1
แก้ปัญหา Cron Jobs ที่ไม่ทำงาน
ตรวจสอบ Log
# ดู Cron Log
sudo grep CRON /var/log/syslog | tail -20
# หรือบน CentOS/RHEL
sudo tail -50 /var/log/cron
Path ไม่ถูกต้อง
Cron ทำงานใน Environment ที่จำกัด ต้องใช้ Absolute Path เสมอ
# ผิด - Cron หา php ไม่เจอ
* * * * * php /var/www/script.php
# ถูก - ใช้ Full Path
* * * * * /usr/bin/php /var/www/script.php
# หา Path ของคำสั่งด้วย which
which php
# Output: /usr/bin/php
สิทธิ์และ Environment Variables
# เพิ่มสิทธิ์ Execute ให้สคริปต์
chmod +x /opt/scripts/backup.sh
# กำหนด PATH ใน crontab
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
Redirect Output เพื่อ Debug
# Redirect ทั้ง stdout และ stderr ไปยังไฟล์ Log
0 2 * * * /opt/scripts/backup.sh >> /var/log/cron-backup.log 2>&1
# ส่งเฉพาะ Error ไปยัง Log
0 2 * * * /opt/scripts/backup.sh > /dev/null 2>> /var/log/cron-error.log
# ปิด Output ทั้งหมด (ไม่แนะนำตอน Debug)
0 2 * * * /opt/scripts/backup.sh > /dev/null 2>&1
คำถามที่พบบ่อย (FAQ)
Cron Job รันได้ถี่สุดแค่ไหน?
ถี่สุดคือทุกนาที (*/1 * * * *) ถ้าต้องการรันถี่กว่านั้น ควรใช้ systemd timer หรือเขียน daemon แทน
Cron Job ทำงานตอนเครื่องปิดอยู่จะเกิดอะไรขึ้น?
Cron Job ที่พลาดไปจะไม่ถูกรันย้อนหลัง ถ้าต้องการรันงานที่พลาดเมื่อเครื่องเปิดขึ้นมา ใช้ Anacron แทน
ทำไม Cron Job ทำงานตอน Login แต่ไม่ทำงานใน crontab?
เป็นเพราะ Environment ต่างกัน Cron ไม่โหลด PATH และ Environment Variables เหมือนตอน Login ใช้ Absolute Path และกำหนด Variables ใน crontab
Cron Jobs เป็นเครื่องมือที่ทรงพลังสำหรับการดูแลเซิร์ฟเวอร์ การเข้าใจ Cron Expression ตั้งค่าถูกต้อง และ Debug ได้เมื่อมีปัญหา ช่วยให้งาน Maintenance ทำงานอัตโนมัติอย่างราบรื่น สำหรับองค์กรที่ต้องการระบบเสถียร Colocation และระบบความปลอดภัยจาก DriteStudio พร้อมรองรับทุกความต้องการ ติดต่อทีมงานได้เลย