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
- สร้าง Shell Script – เขียนคำสั่งที่ต้องการให้ทำงาน
- ทำให้ Executable – รันคำสั่ง
chmod +x script.sh - ทดสอบ Script – รัน Script เพื่อให้แน่ใจว่าทำงานถูกต้อง
- เพิ่มเข้า Crontab – รันคำสั่ง
crontab -eและเพิ่ม Cron Job - ตรวจสอบ 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 ตามตัวอย่างที่แนะนำในบทความนี้
