اعتبارسنج عبارت 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 بر اساس قوانین نحوی پیش از ارسال آن به زمانبند است. یک عبارت cron از پنج فیلد جداشده با فاصله (دقیقه، ساعت، روز ماه، ماه، روز هفته) تشکیل میشود که یک برنامه تکرارشونده را تعریف میکنند. اگر هر فیلد دارای مقدار خارج از محدوده، عملگر نامعتبر یا خطای ساختاری مانند تعداد نادرست فیلدها باشد، عبارت یا در زمان استقرار توسط زمانبند رد میشود یا خاموشانه نادیده گرفته میشود.
اعتبارسنجی آنلاین عبارت cron خطاها را زودتر از استقرار در محیط تولید و بدون اینکه بفهمید کار اجرا نشده شناسایی میکند. اشتباهات رایج شامل نوشتن ۲۵ در فیلد ساعت (محدوده معتبر: ۰-۲۳)، استفاده از گام صفر (*/0 که تعریفنشده است)، معکوس کردن مرزهای محدوده (5-1 به جای 1-5)، یا افزودن فیلدهای اضافه که به قالبهای غیراستاندارد مانند Quartz تعلق دارند میشود. یک بررسیکننده نحو این مشکلات را فوری شناسایی کرده و دقیقاً میگوید کدام فیلد نادرست است.
اعتبارسنجی cron با تجزیه cron تفاوت دارد. یک تجزیهکننده عبارت معتبر را میگیرد و آن را به یک برنامه قابل خواندن تبدیل میکند. یک اعتبارسنج به سوال سادهتری پاسخ میدهد: آیا این عبارت صحیح است؟ پیش از تجزیه اعتبارسنجی کنید — ارسال یک عبارت نامعتبر به زمانبند بیفایده است. در pipelineهای CI/CD، اعتبارسنجی خودکار cron از ادغام برنامههای خراب در فایلهای پیکربندی جلوگیری میکند.
چرا از این اعتبارسنج Cron استفاده کنیم؟
عبارت cron قوانین نحوی سختگیرانهای دارد و زمانبندها هنگام نقض این قوانین پیامهای خطای ناسازگاری ارائه میدهند. برخی زمانبندها عبارت را با خطایی مبهم رد میکنند؛ برخی دیگر آن را بیصدا قبول میکنند و هرگز اجرا نمیشوند. این اعتبارسنج پیش از استقرار یک تشخیص واضح فیلد به فیلد به شما میدهد.
موارد استفاده اعتبارسنج Cron
خطاهای رایج نحو Cron
جدول زیر متداولترین خطاهای عبارت cron و دلایل آنها را فهرست میکند. اینها اشتباهاتی هستند که به طور مکرر در پیکربندیهای محیط تولید و pipelineهای CI/CD ظاهر میشوند.
| نوع خطا | مثال | چه اشتباهی رخ داده |
|---|---|---|
| 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 معتبر و نامعتبر
مرجع سریعی از عبارات صحیح در کنار اشتباهات رایج. از این برای بررسی اولیه عبارت خود پیش از قرار دادن در پیکربندی زمانبند استفاده کنید.
نمونههای کد
نحوه اعتبارسنجی عبارات 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"