
เข้าใจ cron expression แบบไม่ต้องท่อง ด้วย crontab.guru
/ 2 min read
Table of Contents
เคยเปิดไฟล์ตั้งค่าเซิร์ฟเวอร์แล้วเจอบรรทัดแบบ 0 9 * * 1-5 ไหมครับ? ตอนแรกผมก็งงว่าดอกจันกับตัวเลขพวกนี้มันคืออะไร แต่พอเข้าใจแล้วจะเห็นว่ามันคือวิธีบอกเวลาที่กระชับมากๆ นี่แหละคือ cron expression ภาษาสำหรับสั่งว่า “ให้ทำงานนี้ตอนไหน”
cron expression คืออะไร
cron คือตัวตั้งเวลารันงานอัตโนมัติบน Linux/Unix (เช่น สั่งให้ backup ทุกเที่ยงคืน หรือส่งอีเมลทุกเช้า) ส่วน “expression” ก็คือตารางเวลาที่เราเขียนให้มัน
มันมี 5 ช่อง เรียงกัน คั่นด้วยเว้นวรรค แต่ละช่องคือหน่วยเวลาที่ต่างกัน:
* * * * *│ │ │ │ ││ │ │ │ └── วันในสัปดาห์ (0-6, 0 = อาทิตย์)│ │ │ └──── เดือน (1-12)│ │ └────── วันที่ (1-31)│ └──────── ชั่วโมง (0-23)└────────── นาที (0-59)อ่านจากซ้ายไปขวา: นาที → ชั่วโมง → วันที่ → เดือน → วันในสัปดาห์
แล้วเอาไปเขียนที่ไหน? ตารางพวกนี้อยู่ในไฟล์ที่เรียกว่า crontab แก้ได้ด้วยคำสั่ง crontab -e แต่ละบรรทัดคือ expression 5 ช่อง ตามด้วยคำสั่งที่อยากให้รัน แค่นั้นเลย
สัญลักษณ์ที่ต้องรู้ มีแค่ 4 ตัว
นี่คือหัวใจ จำ 4 ตัวนี้ก็อ่าน cron ได้เกินครึ่งแล้ว:
| สัญลักษณ์ | ความหมาย | ตัวอย่าง |
|---|---|---|
* | ทุกค่า | * ในช่องนาที = ทุกนาที |
, | หลายค่า | 1,15,30 = นาทีที่ 1, 15, 30 |
- | ช่วงค่า | 1-5 ในช่องวันในสัปดาห์ = จันทร์ถึงศุกร์ |
/ | ทุกๆ (step) | */15 = ทุกๆ 15 หน่วย |
ตัวอย่างที่เจอบ่อย
พอรู้กฎแล้ว ลองอ่านพวกนี้ดูครับ:
| Expression | แปลว่า |
|---|---|
0 9 * * * | ทุกวัน เวลา 9:00 |
*/15 * * * * | ทุกๆ 15 นาที |
0 0 * * 0 | ทุกวันอาทิตย์ เที่ยงคืน |
0 9 * * 1-5 | จันทร์ถึงศุกร์ เวลา 9:00 |
30 2 1 * * | วันที่ 1 ของทุกเดือน เวลา 2:30 |
เคล็ดลับเวลาอ่าน: ไล่ทีละช่องจากซ้าย แล้วถามตัวเองว่า “ช่องนี้เจาะจงค่าไหน หรือเป็น * (ปล่อยผ่าน)“
ขี้เกียจท่อง? ใช้ crontab.guru
ถ้าไม่อยากนั่งนับช่องเอง มีเว็บที่ผมใช้ประจำคือ crontab.guru พิมพ์ expression ลงไป มันแปลเป็นประโยคภาษาอังกฤษให้ทันที พร้อมบอกด้วยว่ารอบถัดไปจะรันเมื่อไหร่ (next run)
อย่างในรูป พิมพ์ 5 4 * * * มันบอกเลยว่า “At 04:05
” (ทุกวันตี 4 ห้านาที) ด้านล่างยังมีตารางสรุปสัญลักษณ์กับ label แต่ละช่องให้ดูด้วย เหมาะมากเวลาต้องเขียน cron ที่ซับซ้อนแล้วอยากเช็กว่าเขียนถูกไหมก่อนเอาไปใช้จริง
เกร็ด: ทางลัด @daily, @reboot
นอกจากแบบ 5 ช่อง cron บางตัวยังรับ ชื่อย่อ (non-standard) ที่อ่านง่ายกว่า เช่น @daily (= 0 0 * * *), @hourly, @weekly, @monthly และ @reboot (รันตอนเครื่องบูต) ถ้าระบบที่ใช้รองรับ ก็เขียนแบบนี้ให้คนอ่านเข้าใจง่ายขึ้นได้
ส่วนตัวผมว่า cron เป็นหนึ่งในของที่ “ดูน่ากลัวตอนแรก แต่พอเข้าใจ 4 สัญลักษณ์กับลำดับ 5 ช่องแล้วก็จบ” ไม่ต้องท่อง แค่มี crontab.guru เปิดไว้อีกแท็บ เดี๋ยวก็คล่องเอง ครั้งหน้าเจอ * * * * * จะได้ไม่ต้องกลัวอีกครับ


