บทความก่อนหน้าอธิบาย Cron Syntax พื้นฐานไปแล้ว บทความนี้เน้นตัวอย่าง Crontab Configuration จริงที่ใช้ใน Production เช่น Automated Backup, Log Cleanup, Certificate Renewal, Database Dump และ Health Check ตัวอย่างเหล่านี้สามารถนำไปปรับใช้กับ Server จริงได้ทันที
นอกจากตัวอย่าง Crontab แล้ว บทความนี้ยังอธิบายเทคนิคการเขียน Shell Script ให้เหมาะกับ Cron รวมถึงการ Debug เมื่อ Job ไม่ทำงานตามที่คาด
ตัวอย่าง Crontab สำหรับ Production Server
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
# === Backup ===
# Backup Database ทุกคืนเวลา 02:00
0 2 * * * /usr/local/bin/backup-db.sh >> /var/log/backup-db.log 2>&1
# Backup ไฟล์สำคัญทุกอาทิตย์เวลา 03:00
0 3 * * 0 /usr/local/bin/backup-files.sh >> /var/log/backup-files.log 2>&1
# === Cleanup ===
# ลบ Log เก่ากว่า 30 วัน ทุกวันเวลา 04:00
0 4 * * * find /var/log/app/ -name "*.log" -mtime +30 -delete >> /var/log/cleanup.log 2>&1
# ลบ Temp File เก่ากว่า 7 วัน
0 5 * * * find /tmp/ -maxdepth 1 -mtime +7 -delete > /dev/null 2>&1
# === Monitoring ===
# Health Check ทุก 5 นาที
*/5 * * * * /usr/local/bin/healthcheck.sh > /dev/null 2>&1
# === Renewal ===
# ต่ออายุ SSL Certificate ทุกวัน (certbot จะข้ามถ้ายังไม่ถึงเวลา)
0 0 * * * certbot renew --quiet >> /var/log/certbot-renew.log 2>&1
Backup MySQL/MariaDB อัตโนมัติ
#!/bin/bash
# /usr/local/bin/backup-db.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/mysql"
DB_USER="backup_user"
DB_PASS="securepassword"
KEEP_DAYS=7
mkdir -p "$BACKUP_DIR"
# Dump ทุก Database
mysqldump -u "$DB_USER" -p"$DB_PASS" --all-databases \
| gzip > "$BACKUP_DIR/all-databases_$DATE.sql.gz"
echo "[$(date)] Backup completed: all-databases_$DATE.sql.gz"
# ลบ Backup เก่ากว่า 7 วัน
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +"$KEEP_DAYS" -delete
echo "[$(date)] Old backups cleaned up"
# ตั้ง Permission Script
sudo chmod +x /usr/local/bin/backup-db.sh
# เพิ่มใน Crontab
# 0 2 * * * /usr/local/bin/backup-db.sh >> /var/log/backup-db.log 2>&1
Log Rotation ด้วย Cron (Manual)
#!/bin/bash
# /usr/local/bin/rotate-app-logs.sh
# ใช้เมื่อ Application ไม่รองรับ logrotate
LOG_DIR="/var/log/myapp"
MAX_SIZE=104857600 # 100MB
for log_file in "$LOG_DIR"/*.log; do
if [ -f "$log_file" ] && [ $(stat -c%s "$log_file") -gt "$MAX_SIZE" ]; then
mv "$log_file" "${log_file}.$(date +%Y%m%d)"
touch "$log_file"
echo "[$(date)] Rotated: $log_file"
fi
done
# ลบ Rotated Log เก่ากว่า 14 วัน
find "$LOG_DIR" -name "*.log.*" -mtime +14 -delete
Health Check และ Auto-restart
#!/bin/bash
# /usr/local/bin/healthcheck.sh
# ตรวจสอบ Service และ Restart อัตโนมัติ
SERVICE="nginx"
CHECK_URL="http://localhost/health"
# ตรวจสอบด้วย curl
if ! curl -sf "$CHECK_URL" > /dev/null 2>&1; then
echo "[$(date)] $SERVICE is down, restarting..."
systemctl restart "$SERVICE"
# ส่งแจ้งเตือน (ต้องติดตั้ง mailutils ก่อน)
echo "$SERVICE restarted at $(date)" | mail -s "[$SERVICE] Auto-restarted" [email protected]
else
echo "[$(date)] $SERVICE is healthy"
fi
Sync ไฟล์ไปยัง Remote Server
# Sync ไฟล์ไปยัง Backup Server ทุกชั่วโมง (ใช้ rsync + SSH Key)
0 * * * * rsync -az --delete /var/www/html/ [email protected]:/backup/html/ >> /var/log/rsync.log 2>&1
# Sync Database Backup ไปยัง Remote ทุกคืน
30 2 * * * rsync -az /backup/mysql/ [email protected]:/mysql-backups/ >> /var/log/rsync-db.log 2>&1
Report Generation อัตโนมัติ
#!/bin/bash
# /usr/local/bin/daily-report.sh
# สรุปสถิติรายวันและส่ง Email
DATE=$(date +%Y-%m-%d)
REPORT="/tmp/daily-report-$DATE.txt"
echo "=== Daily Report $DATE ===" > "$REPORT"
echo "" >> "$REPORT"
echo "--- Disk Usage ---" >> "$REPORT"
df -h >> "$REPORT"
echo "" >> "$REPORT"
echo "--- Memory Usage ---" >> "$REPORT"
free -h >> "$REPORT"
echo "" >> "$REPORT"
echo "--- Failed Services ---" >> "$REPORT"
systemctl list-units --state=failed >> "$REPORT"
# ส่ง Email
mail -s "Daily Server Report $DATE" [email protected] < "$REPORT"
rm -f "$REPORT"
# รัน Daily Report ทุกวันเวลา 07:00
0 7 * * * /usr/local/bin/daily-report.sh
Debug Cron Job ที่ไม่ทำงาน
เมื่อ Cron Job ไม่ทำงานตามที่คาด ให้ตรวจสอบตามลำดับนี้
# 1. ตรวจสอบว่า cron service รันอยู่
systemctl status cron # Ubuntu/Debian
systemctl status crond # RHEL/CentOS
# 2. ดู Cron Log
grep CRON /var/log/syslog | tail -30 # Ubuntu
tail -30 /var/log/cron # RHEL
# 3. ทดสอบ Script ด้วย User ที่ Cron จะรัน
sudo -u www-data /path/to/script.sh
# 4. ตรวจสอบ PATH ใน Script — ใส่ Full Path ให้ครบ
# แทนที่ python script.py
# ด้วย /usr/bin/python3 /opt/app/script.py
# 5. ทดสอบ Environment ของ Cron
# เพิ่ม Job ทดสอบชั่วคราว
* * * * * env > /tmp/cron-env.txt 2>&1
# ดู Environment ที่ Cron ใช้
cat /tmp/cron-env.txt
Crontab Generator — เครื่องมือช่วย
สำหรับ Cron Expression ที่ซับซ้อน มีเครื่องมือออนไลน์ที่ช่วยสร้างและแปลงความหมายของ Expression ได้ เช่น crontab.guru ซึ่งแสดงผลว่า Expression นั้นจะรันเมื่อไหร่โดยอธิบายเป็นภาษาธรรมชาติ ช่วยลดความผิดพลาดในการตั้งค่า Schedule ได้มาก
สรุป
การใช้ Crontab ใน Production ควรตั้งค่า SHELL, PATH และ MAILTO ไว้ต้นไฟล์ เขียน Script แยกต่างหากและทดสอบก่อนใส่ใน Crontab เสมอ Redirect Output ทุก Job ไปยัง Log File และใช้ Full Path ทั้งใน Crontab และใน Script เมื่อ Job ไม่ทำงานให้ตรวจสอบ Cron Log และทดสอบ Script ด้วย User ที่ Cron จะใช้รัน งาน Automation ทั่วไปอย่าง Backup, Log Cleanup, Health Check และ Report Generation ล้วนเหมาะกับการใช้ Cron Jobs
แนะนำบริการ DE
การตั้งค่า Crontab สำหรับ Automated Backup และ Maintenance Tasks จำเป็นต้องมี Server ที่มีสิทธิ์ root Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบและ Snapshot ก่อน Maintenance เหมาะสำหรับ Production Server ที่ต้องการ Automation เต็มรูปแบบ
หากต้องการ Cron Job สำหรับเว็บไซต์โดยไม่ต้องจัดการ Server เอง Cloud Hosting ของ DE รองรับ Cron Job ผ่าน Control Panel ที่ใช้งานง่าย

