Cron Expression ไขปริศนา: ตั้งเวลาทำอะไรก็ได้
คุณต้องรันการสำรองฐานข้อมูลทุกคืนตี 3 หรือส่งรายงานทุกเช้าวันจันทร์ หรือล้าง cache ทุก 15 นาที บนเซิร์ฟเวอร์ Linux และ Unix เครื่องมือสำหรับสิ่งนี้คือ cron และวิธีบอก cron ว่าจะรันเมื่อไหร่คือ cron expression
Cron expression ดูน่ากลัวเมื่อเห็นครั้งแรก 0 3 * * * หรือ */15 9-17 * * 1-5 อาจดูเหมือนอักษรประหลาดถ้าคุณไม่รู้รูปแบบ แต่ไวยากรณ์นั้นง่ายจนน่าประหลาดใจเมื่อคุณเข้าใจฟิลด์ทั้งห้า
ฟิลด์ทั้งห้า
Cron expression มาตรฐานทุกตัวมีฟิลด์ 5 ฟิลด์ คั่นด้วยช่องว่าง แต่ละฟิลด์แทนหน่วยเวลา:
┌───────────── นาที (0-59)
│ ┌───────────── ชั่วโมง (0-23)
│ │ ┌───────────── วันของเดือน (1-31)
│ │ │ ┌───────────── เดือน (1-12)
│ │ │ │ ┌───────────── วันในสัปดาห์ (0-7, โดย 0 และ 7 คือวันอาทิตย์)
│ │ │ │ │
* * * * *
แค่นี้เอง ห้าฟิลด์ จากซ้ายไปขวา: นาที, ชั่วโมง, วันของเดือน, เดือน, วันในสัปดาห์
รู้หรือไม่? ชื่อ "cron" มาจากคำกรีก "chronos" ที่แปลว่าเวลา cron daemon (โปรเซสเบื้องหลัง) เป็นส่วนหลักของระบบปฏิบัติการแบบ Unix มาตั้งแต่ปี 1975
อักขระพิเศษ
เครื่องหมายดอกจัน (*) — ทุกค่า
เครื่องหมายดอกจันหมายถึง "ทุกค่าที่เป็นไปได้" ของฟิลด์นั้น
* * * * * = ทุกนาทีของทุกชั่วโมงของทุกวัน
เครื่องหมายจุลภาค (,) — หลายค่า
เครื่องหมายจุลภาคคั่นค่าแต่ละตัว
0 9,12,18 * * * = ที่นาทีที่ 0 ของชั่วโมง 9, 12 และ 18 (9:00, 12:00, 18:00)
เครื่องหมายขีด (-) — ช่วงค่า
เครื่องหมายขีดกำหนดช่วง
0 9-17 * * * = ที่นาทีที่ 0 ของทุกชั่วโมงตั้งแต่ 9 ถึง 17 (9:00 ถึง 17:00 ทุกชั่วโมง)
เครื่องหมายทับ (/) — ค่าขั้น
เครื่องหมายทับกำหนดช่วงเวลา
*/15 * * * * = ทุก 15 นาที (นาทีที่ 0, 15, 30, 45 ของทุกชั่วโมง)
0 */2 * * * = ทุก 2 ชั่วโมงที่นาทีที่ 0 (เที่ยงคืน, ตี 2, ตี 4, ...)
การอ่าน Cron Expression: ฝึกปฏิบัติ
มาลองดูตัวอย่างที่พบบ่อย สำหรับแต่ละตัวอย่าง อ่านฟิลด์ทั้งห้าจากซ้ายไปขวา
0 3 * * * — ทุกวันตอนตี 3
| ฟิลด์ | ค่า | ความหมาย |
|---|---|---|
| นาที | 0 | ที่นาทีที่ 0 |
| ชั่วโมง | 3 | ของชั่วโมง 3 (ตี 3) |
| วันของเดือน | * | ทุกวัน |
| เดือน | * | ทุกเดือน |
| วันในสัปดาห์ | * | ทุกวันในสัปดาห์ |
แปลว่า: "ตอนตี 3 ทุกวัน" ตัวเลือกคลาสสิกสำหรับการสำรองข้อมูลตอนกลางคืน
*/15 * * * * — ทุก 15 นาที
| ฟิลด์ | ค่า | ความหมาย |
|---|---|---|
| นาที | */15 | ทุก 15 นาที |
| ชั่วโมง | * | ทุกชั่วโมง |
| วันของเดือน | * | ทุกวัน |
| เดือน | * | ทุกเดือน |
| วันในสัปดาห์ | * | ทุกวัน |
แปลว่า: "ทุก 15 นาที ตลอด 24 ชั่วโมง" พบบ่อยสำหรับ health check และการรีเฟรช cache
0 9 * * 1-5 — วันธรรมดาตอน 9:00
| ฟิลด์ | ค่า | ความหมาย |
|---|---|---|
| นาที | 0 | ที่นาทีที่ 0 |
| ชั่วโมง | 9 | ของชั่วโมง 9 |
| วันของเดือน | * | ทุกวัน |
| เดือน | * | ทุกเดือน |
| วันในสัปดาห์ | 1-5 | จันทร์ถึงศุกร์ |
แปลว่า: "ตอน 9:00 วันจันทร์ถึงวันศุกร์" เหมาะสำหรับรายงานประจำวัน
0 0 1 * * — วันแรกของทุกเดือน
| ฟิลด์ | ค่า | ความหมาย |
|---|---|---|
| นาที | 0 | ที่นาทีที่ 0 |
| ชั่วโมง | 0 | ของชั่วโมง 0 (เที่ยงคืน) |
| วันของเดือน | 1 | วันที่ 1 |
| เดือน | * | ทุกเดือน |
| วันในสัปดาห์ | * | ไม่จำกัดวัน |
แปลว่า: "เที่ยงคืนของวันแรกของทุกเดือน" ใช้สำหรับรายงานรายเดือน การเรียกเก็บเงิน หรือการทำความสะอาด
30 8 * * 1 — วันจันทร์ 8:30
| ฟิลด์ | ค่า | ความหมาย |
|---|---|---|
| นาที | 30 | ที่นาทีที่ 30 |
| ชั่วโมง | 8 | ของชั่วโมง 8 |
| วันของเดือน | * | ทุกวัน |
| เดือน | * | ทุกเดือน |
| วันในสัปดาห์ | 1 | วันจันทร์ |
แปลว่า: "8:30 ทุกวันจันทร์" เหมาะสำหรับการแจ้งเตือนทีมรายสัปดาห์
การเขียน Cron Expression ของคุณเอง
นี่คือวิธีที่เป็นระบบ:
- เริ่มจากเมื่อไหร่ "ทุกวันตอนตี 3" หรือ "ทุก 5 นาทีในเวลาทำงาน"
- กรอกฟิลด์จากซ้ายไปขวา เริ่มจากนาที แล้วชั่วโมง แล้ววันของเดือน แล้วเดือน แล้ววันในสัปดาห์
- ใช้
*สำหรับ "ทุก" ถ้าไม่สนใจฟิลด์ไหน ใช้* - ทดสอบก่อนติดตั้ง ตรวจสอบว่า expression ของคุณสร้างตารางเวลาที่ต้องการเสมอ
อ้างอิงรูปแบบที่พบบ่อย
| ตารางเวลา | Expression |
|---|---|
| ทุกนาที | * * * * * |
| ทุก 5 นาที | */5 * * * * |
| ทุกชั่วโมง | 0 * * * * |
| ทุกวันเที่ยงคืน | 0 0 * * * |
| ทุกวันตอนตี 3 | 0 3 * * * |
| ทุกวันจันทร์ 9:00 | 0 9 * * 1 |
| วันธรรมดา 8:30 | 30 8 * * 1-5 |
| วันแรกของทุกเดือน | 0 0 1 * * |
| ทุก 15 นาที ในเวลาทำงาน | */15 9-17 * * 1-5 |
| วันละสองครั้ง (9:00 และ 18:00) | 0 9,18 * * * |
| ทุกวันอาทิตย์ ตี 2 | 0 2 * * 0 |
ข้อผิดพลาดที่พบบ่อย
ลืมว่าชั่วโมงเป็น 0-23
ชั่วโมง 13 คือ 13:00 (บ่ายโมง) ไม่ใช่ชั่วโมง 1 ข้อผิดพลาดที่พบบ่อยคือเขียน 0 1 * * * โดยคิดว่ารันตอนบ่ายโมง แต่จริงๆ มันรันตอนตี 1
ความสับสนเรื่องวันในสัปดาห์
วันอาทิตย์เป็นได้ทั้ง 0 หรือ 7 (ทั้งสองถูกต้อง) วันจันทร์คือ 1 วันเสาร์คือ 6 บางคนคาดว่าวันจันทร์จะเป็น 0
ปฏิสัมพันธ์ระหว่างวันของเดือนกับวันในสัปดาห์
หากคุณระบุทั้งวันของเดือนและวันในสัปดาห์ (ไม่มีตัวไหนเป็น *) การใช้งาน cron ส่วนใหญ่จะรันงานเมื่อเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริง ไม่ใช่เมื่อทั้งสองเป็นจริง สิ่งนี้ทำให้หลายคนสับสน
คำเตือน Expression 0 9 15 * 1 ไม่ได้หมายความว่า "9:00 วันที่ 15 แต่เฉพาะถ้าเป็นวันจันทร์" มันหมายความว่า "9:00 วันที่ 15 ของทุกเดือน และ 9:00 ทุกวันจันทร์" นี่คือแหล่งที่มาของพฤติกรรมที่ไม่คาดคิดที่พบบ่อย
การตระหนักเรื่อง Time Zone
Cron ทำงานใน time zone ของเซิร์ฟเวอร์ ถ้าเซิร์ฟเวอร์ของคุณอยู่ใน UTC และคุณอยู่ในประเทศไทย (UTC+7) cron job 0 9 * * * จะรันตอน 16:00 เวลาไทย ตรวจสอบ time zone ของเซิร์ฟเวอร์เสมอ
เคล็ดลับ ทดสอบและแสดงผล cron expression ก่อนติดตั้ง: วิธีอ่านและทดสอบ Cron Expression ดูเวลารันครั้งถัดไปและยืนยันว่าตารางเวลาตรงกับที่คุณต้องการ
สร้างและทดสอบ cron expression ของคุณ:
ฟรี ทันที และไม่ต้องลงทะเบียน