Cron Job + Shell Script: ตั้งเวลา Backup และ Maintenance อัตโนมัติ

Cron Job และ Shell Script เป็นเครื่องมือพื้นฐานที่สำคัญในการจัดการ Linux/Unix Server สำหรับการตั้งเวลา Backup และ Maintenance อัตโนมัติ บทความนี้จะอธิบายถึงหลักการใช้งาน Cron Job ร่วมกับ Shell Script เพื่อให้คุณสามารถสร้าง Automation Task ต่างๆ ได้อย่างมีประสิทธิภาพ

Cron Job คืออะไร

Cron Job เป็นระบบตัวกำหนดเวลา (Scheduler) ใน Linux/Unix ที่ช่วยให้คุณสามารถรันโปรแกรมหรือ Script ตามเวลาที่กำหนดไว้ โดยอัตโนมัติ ไม่จำเป็นต้องเข้ามาเรียกโปรแกรมด้วยตนเอง

Cron Job ช่วยให้การจัดการ Task ที่ซ้ำเดิมตามเวลาเป็นไปได้อย่างง่าย เช่น:

  • ทำงานทุกๆ ชั่วโมง
  • ทำงานทุกๆ วัน เวลาเดียวกัน
  • ทำงานในวันใดของสัปดาห์
  • ทำงานในวันที่กำหนด

Shell Script คืออะไร

Shell Script เป็นไฟล์ข้อความที่เก็บคำสั่ง (Commands) หลายคำสั่งรวมไว้ด้วยกัน เมื่อรันไฟล์นี้ Shell จะดำเนินการคำสั่งทั้งหมดตามลำดับ

Shell Script ที่นิยมใช้กันคือ Bash Shell (Bourne Again Shell) ซึ่งเป็นมาตรฐานในการเขียน Script บน Linux Server

ทำไมต้องใช้ Cron Job + Shell Script

การรวมกันระหว่าง Cron Job และ Shell Script ทำให้คุณสามารถ Automation Task ต่างๆ ได้อย่างมีประสิทธิภาพ:

  • Backup Database อัตโนมัติ – ทำ Backup ทุกวันโดยไม่ต้องเข้ามาทำเอง
  • Monitor Server – ตรวจสอบสถานะ CPU, Memory, Disk สม่ำเสมอ
  • Clean-up ไฟล์เก่า – ลบไฟล์ Temporary หรือ Log เก่าโดยอัตโนมัติ
  • Update และ Patch System – อัพเดท Software และ Security Patch
  • Maintenance Server – ดำเนินการ Maintenance ตามตารางเวลา
  • Sync Data – ซิงข์ข้อมูลระหว่าง Server ต่างๆ
  • Generate Reports – สร้างรายงานให้อัตโนมัติ
  • Renew Certificate – ต่ออายุ SSL/TLS Certificate

Cron Job Syntax – โครงสร้างพื้นฐาน

Cron Job มีโครงสร้างพื้นฐานดังนี้:

*     *     *     *     *     command to execute
|     |     |     |     |
|     |     |     |     +-- Day of week (0-6, 0 = Sunday)
|     |     |     +------- Month (1-12)
|     |     +---------- Day of month (1-31)
|     +------------- Hour (0-23)
+----------------- Minute (0-59)

ตัวอย่าง Cron Job Expressions

0 0 * * *   /home/user/backup.sh
(ทำงานเวลา 00:00 ทุกวัน)

0 */2 * * *   /home/user/monitor.sh
(ทำงานทุก 2 ชั่วโมง)

0 0 * * 0   /home/user/weekly-backup.sh
(ทำงานเวลา 00:00 ทุกวันอาทิตย์)

0 0 1 * *   /home/user/monthly-backup.sh
(ทำงานเวลา 00:00 วันที่ 1 ของเดือน)

*/5 * * * *   /home/user/check-server.sh
(ทำงานทุก 5 นาที)

0 6 * * 1-5   /home/user/weekday-task.sh
(ทำงานเวลา 06:00 จันทร์-ศุกร์)

ตัวอย่าง Shell Script สำหรับ Database Backup

นี่คือตัวอย่าง Shell Script สำหรับการ Backup Database MySQL/MariaDB:

#!/bin/bash

# กำหนดตัวแปร
BACKUP_DIR="/backups"
DB_NAME="myapp_db"
DB_USER="root"
DB_PASSWORD="secure_password"
DB_HOST="localhost"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql"
LOG_FILE="$BACKUP_DIR/backup.log"

# สร้างโฟลเดอร์ Backup ถ้ายังไม่มี
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

# ทำ Backup Database
echo "[$(date)] เริ่มทำ Backup Database: $DB_NAME" >> $LOG_FILE
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE 2>> $LOG_FILE

# ตรวจสอบว่า Backup สำเร็จหรือไม่
if [ $? -eq 0 ]; then
    echo "[$(date)] Backup สำเร็จ: $BACKUP_FILE" >> $LOG_FILE
    
    # ลบ Backup เก่ากว่า 7 วัน
    find $BACKUP_DIR -name "${DB_NAME}_*.sql" -mtime +7 -delete
    echo "[$(date)] ลบ Backup เก่า" >> $LOG_FILE
else
    echo "[$(date)] Backup ล้มเหลว" >> $LOG_FILE
    exit 1
fi

ตัวอย่าง Shell Script สำหรับ Server Monitoring

นี่คือตัวอย่าง Shell Script สำหรับการตรวจสอบสถานะ Server (CPU, Memory, Disk):

#!/bin/bash

# กำหนดค่า Threshold สำหรับเตือน
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80
LOG_FILE="/var/log/server-monitor.log"

# ฟังก์ชันตรวจสอบ CPU Usage
check_cpu() {
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    CPU_INT=$(echo "$CPU_USAGE" | cut -d. -f1)
    
    if [ $CPU_INT -gt $CPU_THRESHOLD ]; then
        echo "[$(date)]경告: CPU Usage = ${CPU_USAGE}%" >> $LOG_FILE
    fi
}

# ฟังก์ชันตรวจสอบ Memory Usage
check_memory() {
    MEMORY_USAGE=$(free | grep Mem | awk '{printf("%.2f", ($3/$2) * 100)}')
    MEMORY_INT=$(echo "$MEMORY_USAGE" | cut -d. -f1)
    
    if [ $MEMORY_INT -gt $MEMORY_THRESHOLD ]; then
        echo "[$(date)]경告: Memory Usage = ${MEMORY_USAGE}%" >> $LOG_FILE
    fi
}

# ฟังก์ชันตรวจสอบ Disk Usage
check_disk() {
    DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | cut -d% -f1)
    
    if [ $DISK_USAGE -gt $DISK_THRESHOLD ]; then
        echo "[$(date)]경告: Disk Usage = ${DISK_USAGE}%" >> $LOG_FILE
    fi
}

# รันตรวจสอบทั้งหมด
check_cpu
check_memory
check_disk

echo "[$(date)] Monitoring check completed" >> $LOG_FILE

คำสั่ง Crontab Management

วิธีการจัดการ Crontab ด้วยคำสั่งต่างๆ:

# ดูรายการ Cron Jobs ที่มีอยู่
crontab -l

# แก้ไข Cron Jobs ด้วย Editor (vi/nano)
crontab -e

# ลบ Cron Jobs ทั้งหมด
crontab -r

# ลบ Cron Jobs ของผู้ใช้อื่น (ต้องเป็น root)
sudo crontab -u username -r

# ดูไฟล์ Log ของ Cron
sudo tail -f /var/log/syslog | grep CRON

ขั้นตอนการสร้าง Cron Job

  1. สร้าง Shell Script – เขียนคำสั่งที่ต้องการให้ทำงาน
  2. ทำให้ Executable – รันคำสั่ง chmod +x script.sh
  3. ทดสอบ Script – รัน Script เพื่อให้แน่ใจว่าทำงานถูกต้อง
  4. เพิ่มเข้า Crontab – รันคำสั่ง crontab -e และเพิ่ม Cron Job
  5. ตรวจสอบ Log – ดู Log ของ Cron เพื่อให้แน่ใจว่าทำงาน

Best Practices สำหรับ Cron Job + Shell Script

  • ใช้ Full Path – ระบุเส้นทางเต็มสำหรับ Commands และ Scripts
  • เพิ่ม Shebang – เริ่มต้น Script ด้วย #!/bin/bash
  • เพิ่ม Error Handling – ตรวจสอบ Error และจัดการให้เหมาะสม
  • บันทึก Log – เขียน Log เพื่อติดตามการทำงาน
  • ทดสอบก่อน Deploy – รัน Script ด้วยตนเองก่อนเพิ่มเข้า Crontab
  • กำหนดสิทธิ์ File – ใช้ chmod 755 สำหรับ Script File
  • ดูแล Logs – ตรวจสอบ Cron Log เป็นประจำ
  • ใช้ Absolute Path – หลีกเลี่ยงการใช้ Relative Path
  • ทำ Backup ข้อมูล Database และ Website
  • ตรวจสอบสถานะ Website
  • ลบไฟล์ Temporary
  • ซิงข์ข้อมูลระหว่าง Server
  • สร้าง Report การใช้งาน

สรุป

Cron Job + Shell Script เป็นเครื่องมือที่ทรงพลังสำหรับการ Automation Task ต่างๆ บน Linux/Unix Server โดยรวมทั้งหมดแล้ว คุณสามารถตั้งเวลา Backup, Monitoring, Maintenance และอื่นๆ ให้ทำงานอัตโนมัติตามตารางเวลาที่กำหนด

สำหรับผู้ใช้ VPS ที่ต้องการเพิ่มความปลอดภัยและประสิทธิภาพในการจัดการ Server ให้ลองใช้ Cron Job + Shell Script ตามตัวอย่างที่แนะนำในบทความนี้