IT General
น้องๆ เคยสงสัยไหมว่า พวกระบบแจ้งเตือนตอนตีสาม, ระบบ backup ข้อมูลตอนเที่ยงคืน, หรือแม้แต่ระบบส่งอีเมลสรุปยอดขายตอนห้าโมงเย็น มันทำงานได้ยังไงอัตโนมัติ? คำตอบคือ Cron Job นี่แหละ!
Cron Job มันก็คือตัวตั้งเวลาให้ระบบทำงานบางอย่างที่เรากำหนดไว้ ในช่วงเวลาที่เราต้องการ สมัยผมทำร้านเน็ต SiamCafe นี่สำคัญมากนะ เพราะต้องตั้งเวลา restart เครื่องลูกข่ายทุกวันตอนเช้า เพื่อเคลียร์ cache และให้เครื่องมันสดใหม่เสมอ
ทำไม Cron Job ถึงสำคัญ? ลองคิดดูว่าถ้าเราต้องมานั่ง backup ฐานข้อมูลทุกวันตอนเที่ยงคืนด้วยตัวเอง มันคงไม่ไหวใช่ไหม? Cron Job ช่วยให้เรา automate งาน routine พวกนี้ได้ ทำให้เรามีเวลาไปโฟกัสกับงานที่สำคัญกว่าได้เยอะเลย
หัวใจหลักของ Cron Job คือ syntax หรือรูปแบบการเขียนคำสั่งที่ดูเหมือนยาก แต่จริงๆ แล้วไม่ซับซ้อนอย่างที่คิด ลองดูตารางนี้
| Field | Description | Allowed Values |
|---|---|---|
| Minute | นาที | 0-59 |
| Hour | ชั่วโมง | 0-23 |
| Day of month | วันที่ของเดือน | 1-31 |
| Month | เดือน | 1-12 (or Jan-Dec) |
| Day of week | วันของสัปดาห์ | 0-6 (or Sun-Sat) |
ตัวอย่างเช่น ถ้าเราต้องการให้ script ทำงานทุกวันตอนตีหนึ่ง เราจะเขียน Cron Job แบบนี้:
0 1 * * * /path/to/your/script.sh
0 คือนาทีที่ 0, 1 คือชั่วโมงที่ 1 (ตีหนึ่ง), * หมายถึงทุกวัน, ทุกเดือน, และทุกวันในสัปดาห์ ส่วน /path/to/your/script.sh คือ path ของ script ที่เราต้องการให้รัน
Crontab ก็คือไฟล์ที่เก็บ Cron Job ทั้งหมดของเรา เปรียบเสมือนสมุดนัดหมายของระบบ Cron เราสามารถแก้ไข Crontab ได้ด้วยคำสั่ง crontab -e ใน terminal
สมัยผมทำร้านเน็ต เคยเจอเคสที่ลูกค้าไปแก้ Crontab มั่วๆ แล้วทำให้ระบบรวนไปหมด ต้องคอยสอนวิธีแก้กันวุ่นวายเลย (หัวเราะ)
การใช้งาน Cron Job จริงๆ ไม่ยากอย่างที่คิด แค่เข้าใจ syntax และวิธีการแก้ไข Crontab ก็ไปได้สวยแล้ว
เปิด terminal แล้วพิมพ์คำสั่ง crontab -e ระบบจะเปิดไฟล์ Crontab ด้วย editor ที่เราตั้งค่าไว้ (ส่วนใหญ่จะเป็น vi หรือ nano) ถ้าไม่เคยตั้งค่าไว้ มันจะถามเราว่าจะใช้ editor อะไร
จากนั้นก็เพิ่ม Cron Job ของเราเข้าไปในไฟล์ ตัวอย่างเช่น ถ้าเราต้องการให้ script /home/user/backup.sh ทำงานทุกวันตอนเที่ยงคืน เราจะเพิ่มบรรทัดนี้เข้าไป:
0 0 * * * /home/user/backup.sh
เสร็จแล้วก็ save ไฟล์ (ใน vi กด Esc แล้วพิมพ์ :wq แล้วกด Enter, ใน nano กด Ctrl+X แล้วตอบ Y แล้วกด Enter)
หลังจากแก้ไข Crontab แล้ว เราสามารถตรวจสอบได้ว่า Cron Job ของเราถูกเพิ่มเข้าไปในระบบหรือยัง ด้วยคำสั่ง crontab -l คำสั่งนี้จะแสดงรายการ Cron Job ทั้งหมดที่เราตั้งค่าไว้
ถ้าเราอยากรู้ว่า Cron Job ของเราทำงานได้ถูกต้องไหม เราสามารถดู log file ของ Cron ได้ โดยปกติแล้ว log file จะอยู่ที่ /var/log/syslog หรือ /var/log/cron (ขึ้นอยู่กับระบบปฏิบัติการ)
ถ้ายังไม่เข้าใจลองเข้าไปดูบทความอื่นๆ ใน SiamCafe Blog ได้นะ
นอกจาก Cron Job แล้ว ยังมีทางเลือกอื่นๆ ในการ scheduling task อีกมากมาย แต่ละทางเลือกก็มีข้อดีข้อเสียแตกต่างกันไป
| Tool | Pros | Cons |
|---|---|---|
| Cron Job | ใช้ง่าย, ติดตั้งมาพร้อมกับระบบปฏิบัติการ Linux/Unix, ฟรี | syntax เข้าใจยาก, แก้ไขยาก, ไม่มี GUI |
| Systemd Timers | ยืดหยุ่นกว่า Cron Job, integrate กับ systemd, มี logging ที่ดีกว่า | ซับซ้อนกว่า Cron Job, ต้องเข้าใจ systemd |
| Airflow | เหมาะกับ workflow ที่ซับซ้อน, มี GUI, มี monitoring ที่ดี | ซับซ้อน, ต้องติดตั้งและ configure เพิ่มเติม |
สมัยผมทำร้านเน็ต ก็ใช้ Cron Job เป็นหลัก เพราะมันง่ายและสะดวก แต่ถ้าเป็นงานที่ซับซ้อนกว่านั้น อาจจะต้องพิจารณาใช้เครื่องมืออื่นแทน
สำหรับน้องๆ ที่อยากลองเล่น Cron Job แบบง่ายๆ ลองเข้าไปดูบทความใน SiamCafe Blog เพิ่มเติมได้นะ มีตัวอย่าง code snippet ให้ลองเล่นเยอะเลย
เอาล่ะน้องๆ หลังจากที่เราเข้าใจพื้นฐาน Cron Job กันแล้ว คราวนี้มาดูเคล็ดลับที่พี่ใช้จริงสมัยทำร้านเน็ต SiamCafe กันดีกว่า รับรองว่าเอาไปใช้แล้วชีวิตง่ายขึ้นเยอะ!
สมัยก่อน Server ร้านเน็ตมี Cron Job เป็นสิบๆ ตัว พี่เคยเจอเคสที่ตัวเองงงเองว่าไอ้ Cron ตัวนี้มันรันอะไรวะ? ดังนั้น Comment สำคัญมากๆ เขียนอธิบายไปเลยว่ามันทำอะไร รันเมื่อไหร่ ใครเป็นคนสร้าง
# Backup database every night at 3 AM
0 3 * * * root /usr/local/bin/backup_db.sh
เห็นไหม แค่นี้ก็เข้าใจได้ง่ายขึ้นเยอะ
อย่าปล่อยให้ Cron Job รันแบบเงียบๆ! จับมัน Log ทุกอย่างที่มันทำ ไม่ว่าจะ Error หรือ Success เพราะเวลาเกิดปัญหา เราจะได้มี Log เอาไว้ตามรอยได้
0 3 * * * root /usr/local/bin/backup_db.sh > /var/log/backup_db.log 2>&1
> /var/log/backup_db.log 2>&1 นี่แหละคือตัว Log ทุกอย่างลงไฟล์
ก่อนจะเอา Cron Job ขึ้น Production จริงๆ ทดสอบให้ดีก่อนเสมอ! ลองรัน Script เองดูก่อน แล้วค่อยเอาไปใส่ใน Crontab
สมัยก่อนพี่เคยพลาด Script backup database error แล้วปล่อยให้รันไปหลายวัน กว่าจะรู้ตัวข้อมูลหายไปเยอะเลย เข็ดจนตาย!
ถ้ามี Cron Job หลายตัวที่รันพร้อมๆ กัน อาจจะทำให้ Server โหลดหนักได้ ลองกระจายเวลาให้มันรันเหลื่อมๆ กันดู
# Backup database (random minute)
*/15 * * * * root /usr/local/bin/backup_db.sh > /var/log/backup_db.log 2>&1
อย่างตัวอย่างนี้ จะรันทุก 15 นาที แต่เวลาเริ่มจะสุ่มไปเรื่อยๆ
ตั้งระบบ Monitor Cron Job ด้วย สมัยนี้มีเครื่องมือเยอะแยะที่ช่วยตรวจสอบว่า Cron Job รันสำเร็จไหม ถ้าไม่สำเร็จก็ให้แจ้งเตือน
อย่ารอให้มีคนมาบอกว่าระบบพัง ค่อยรู้ตัว!
อันนี้เจอบ่อยมาก! เช็ค Permission ของ Script ก่อนเลยว่า User ที่รัน Cron Job มีสิทธิ์ Execute ไหม? แล้วก็เช็ค Log ด้วยว่ามี Error อะไรหรือเปล่า
ปกติ Log ของ Cron Job จะอยู่ใน /var/log/syslog หรือ /var/log/cron ลองไปเปิดดูได้เลย
ถ้า Script ใช้เวลานาน อาจจะรันซ้ำกับ Cron Job ที่รันรอบใหม่ได้ ลองใช้ Lock File เพื่อป้องกันไม่ให้รันซ้ำ หรือปรับเวลาให้เหมาะสม
ใช้คำสั่ง crontab -e เพื่อแก้ไข Crontab ของ User ตัวเอง
Cron Job เป็นเครื่องมือที่ทรงพลังมาก ถ้าใช้ให้เป็นจะช่วยให้ชีวิตเราง่ายขึ้นเยอะ แต่ก็ต้องระวังเรื่องความปลอดภัยและการจัดการด้วย
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะ ลองเอาไปปรับใช้กันดู iCafeForex และอย่าลืมติดตาม SiamCafe Blog เพื่ออ่านบทความดีๆ อีกเพียบ