ตัวตรวจสอบนิพจน์ Cron
ตรวจสอบนิพจน์ cron และดูรายละเอียดแต่ละช่องอย่างครบถ้วน
นิพจน์ cron
minute hour day(month) month day(week)
รายละเอียดช่อง
*/15(0–59)ขยายเป็น: 0, 15, 30, 45
0-6(0–23)ขยายเป็น: 0, 1, 2, 3, 4, 5, 6
1,15(1–31)ขยายเป็น: 1, 15
*(1–12)ขยายเป็น: all (1–12)
1-5(0–6)ขยายเป็น: 1, 2, 3, 4, 5
การตรวจสอบนิพจน์ Cron คืออะไร?
การตรวจสอบนิพจน์ cron คือกระบวนการตรวจสอบว่าสตริง cron ปฏิบัติตามกฎไวยากรณ์ที่ถูกต้องก่อนที่จะส่งถึง scheduler นิพจน์ cron ใช้ห้าช่องที่คั่นด้วยช่องว่าง (นาที ชั่วโมง วันในเดือน เดือน วันในสัปดาห์) เพื่อกำหนดตารางงานที่เกิดซ้ำ หากช่องใดมีค่าเกินช่วงที่อนุญาต ตัวดำเนินการที่ไม่ถูกต้อง หรือข้อผิดพลาดเชิงโครงสร้างเช่นจำนวนช่องไม่ถูกต้อง นิพจน์จะถูก scheduler ปฏิเสธเมื่อ deploy หรืออาจไม่ตรงกับเวลาทริกเกอร์ใดๆ อย่างเงียบๆ
การตรวจสอบนิพจน์ cron ออนไลน์ช่วยจับข้อผิดพลาดได้เร็วกว่าการ deploy ขึ้น production และรอให้งานพลาด ข้อผิดพลาดที่พบบ่อย ได้แก่ การเขียน 25 ในช่องชั่วโมง (ช่วงที่ถูกต้อง: 0-23), การใช้ step เป็นศูนย์ (*/0 ซึ่งไม่ได้กำหนดไว้), การสลับขอบเขต range (5-1 แทนที่จะเป็น 1-5) หรือการเพิ่มช่องพิเศษที่เป็นของรูปแบบที่ไม่ใช่มาตรฐานเช่น Quartz ตัวตรวจสอบไวยากรณ์จะแจ้งปัญหาเหล่านี้ทันทีและบอกว่าช่องใดที่ผิด
การตรวจสอบ cron แตกต่างจากการวิเคราะห์ cron ตัววิเคราะห์รับนิพจน์ที่ถูกต้องและแปลงเป็นตารางงานที่อ่านได้ง่าย ส่วนตัวตรวจสอบตอบคำถามที่ง่ายกว่า: นิพจน์นี้มีรูปแบบที่ถูกต้องหรือไม่? ตรวจสอบก่อนวิเคราะห์ — ไม่มีประโยชน์ที่จะส่งนิพจน์ที่ไม่ถูกต้องให้ scheduler ใน CI/CD pipelines การตรวจสอบ cron อัตโนมัติป้องกันไม่ให้ตารางงานที่เสียหายถูก merge เข้าไฟล์ config
ทำไมต้องใช้ตัวตรวจสอบ Cron นี้?
นิพจน์ cron มีกฎไวยากรณ์ที่เข้มงวด และ schedulers มักให้ข้อความแจ้งข้อผิดพลาดที่ไม่สอดคล้องกันเมื่อกฎเหล่านั้นถูกละเมิด บาง schedulers ปฏิเสธนิพจน์ด้วยข้อผิดพลาดที่อ่านยาก บางตัวยอมรับอย่างเงียบๆ และไม่ทำงาน ตัวตรวจสอบนี้ให้การวินิจฉัยที่ชัดเจนเป็นช่องต่อช่องก่อนที่คุณจะ deploy
กรณีการใช้งานตัวตรวจสอบ Cron
ข้อผิดพลาดไวยากรณ์ Cron ที่พบบ่อย
ตารางด้านล่างแสดงข้อผิดพลาดนิพจน์ cron ที่พบบ่อยที่สุดและสาเหตุ เหล่านี้คือความผิดพลาดที่เกิดขึ้นซ้ำๆ ในการตั้งค่า production และ CI/CD pipelines
| ประเภทข้อผิดพลาด | ตัวอย่าง | สิ่งที่ผิดพลาด |
|---|---|---|
| Too few fields | 0 9 * * | Missing the day-of-week field. Standard cron requires exactly 5 fields. |
| Too many fields | 0 0 9 * * 1 2026 | Extra fields. Some tools add seconds or year, but standard cron uses 5. |
| Value out of range | 0 25 * * * | Hour field accepts 0-23. Value 25 exceeds the maximum. |
| Invalid step base | 0 0 32/2 * * | Day-of-month starts at 32, which exceeds the 1-31 range. |
| Step of zero | */0 * * * * | Step value must be 1 or greater. Zero creates an infinite loop. |
| Empty field | 0 9 * * 1 | Double space creates an empty field. Each field needs a value. |
| Invalid character | 0 9 * * Mon-Fry | Typo in day name. Use three-letter abbreviations: MON, TUE, WED, THU, FRI, SAT, SUN. |
| Reversed range | 0 9 * * 5-1 | Range end (1) is less than start (5). Write 1-5 or use a list: 5,6,0,1. |
นิพจน์ Cron ที่ถูกต้องและไม่ถูกต้อง
การอ้างอิงด่วนของนิพจน์ที่มีรูปแบบถูกต้องพร้อมกับข้อผิดพลาดที่พบบ่อย ใช้สิ่งนี้เพื่อตรวจสอบนิพจน์ของคุณก่อนวางในการตั้งค่า scheduler
ตัวอย่างโค้ด
วิธีตรวจสอบนิพจน์ cron ด้วยโปรแกรมใน JavaScript, Python, Go และ Bash แต่ละตัวอย่างแสดงวิธีจับไวยากรณ์ที่ไม่ถูกต้องและดึงข้อความแจ้งข้อผิดพลาดที่มีความหมาย
import { parseExpression } from 'cron-parser';
// Validate a cron expression by attempting to parse it
function validateCron(expr) {
try {
parseExpression(expr);
return { valid: true, error: null };
} catch (err) {
return { valid: false, error: err.message };
}
}
console.log(validateCron('0 9 * * 1-5'));
// → { valid: true, error: null }
console.log(validateCron('0 25 * * *'));
// → { valid: false, error: "Constraint error, got value 25 expected range 0-23" }
// Validate with field-level detail using cron-validator
import { isValidCron } from 'cron-validator';
isValidCron('*/15 * * * *'); // → true
isValidCron('*/15 * * * *', { seconds: true }); // → false (expects 6 fields)
isValidCron('0 0 31 2 *'); // → true (syntactically valid, Feb 31 never fires)from croniter import croniter
# Validate by checking if croniter can parse the expression
def validate_cron(expr: str) -> dict:
if croniter.is_valid(expr):
return {"valid": True, "error": None}
# Get a more specific error message
try:
croniter(expr)
except (ValueError, KeyError) as e:
return {"valid": False, "error": str(e)}
return {"valid": False, "error": "Unknown error"}
print(validate_cron("0 9 * * 1-5"))
# → {'valid': True, 'error': None}
print(validate_cron("0 25 * * *"))
# → {'valid': False, 'error': '...out of range...'}
print(validate_cron("* * *"))
# → {'valid': False, 'error': 'Exactly 5 or 6 columns...'}
# Field-level validation
from crontab import CronTab
cron = CronTab(tab="")
job = cron.new(command="/bin/true")
try:
job.setall("0 9 * * 1-5")
print(job.is_valid()) # → True
except Exception as e:
print(f"Invalid: {e}")package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
// ValidateCron checks whether a 5-field cron expression is syntactically correct
func ValidateCron(expr string) (bool, error) {
parser := cron.NewParser(
cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow,
)
_, err := parser.Parse(expr)
if err != nil {
return false, err
}
return true, nil
}
func main() {
exprs := []string{
"0 9 * * 1-5", // valid
"0 25 * * *", // invalid: hour 25
"*/15 * * * *", // valid
"0 0 32 * *", // invalid: day 32
}
for _, e := range exprs {
ok, err := ValidateCron(e)
if ok {
fmt.Printf("%-20s VALID
", e)
} else {
fmt.Printf("%-20s INVALID: %v
", e, err)
}
}
}#!/bin/bash
# Validate cron syntax using Python one-liner
validate_cron() {
python3 -c "
from croniter import croniter
import sys
expr = sys.argv[1]
if croniter.is_valid(expr):
print(f'VALID: {expr}')
sys.exit(0)
else:
print(f'INVALID: {expr}')
sys.exit(1)
" "$1"
}
validate_cron "0 9 * * 1-5" # → VALID: 0 9 * * 1-5
validate_cron "0 25 * * *" # → INVALID: 0 25 * * *
# Quick regex pre-check (catches field count and obvious issues)
cron_regex='^([0-9*/,-]+\s+){4}[0-9*/,-]+$'
echo "*/5 * * * *" | grep -Eq "$cron_regex" && echo "passes basic check"
echo "* * *" | grep -Eq "$cron_regex" || echo "fails basic check"