محقق تعبيرات 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 أونلاين يكتشف الأخطاء في مرحلة أبكر من النشر إلى الإنتاج والانتظار حتى تضيع مهمة. الأخطاء الشائعة تشمل: كتابة 25 في حقل الساعة (النطاق الصحيح: 0-23)، أو استخدام خطوة بقيمة صفر (*/0 وهو غير معرَّف)، أو عكس حدود النطاق (5-1 بدلاً من 1-5)، أو إضافة حقول إضافية تخص صيغاً غير قياسية مثل Quartz. يرصد محقق بناء الجملة هذه المشكلات فوراً ويُخبرك بالضبط أي حقل فيه الخطأ.
التحقق من صحة تعبيرات cron يختلف عن تحليلها. المحلل يأخذ تعبيراً صحيحاً ويترجمه إلى جدول مقروء للإنسان. أما المحقق فيجيب على سؤال أبسط: هل هذا التعبير مُكوَّن بشكل صحيح؟ تحقق قبل أن تحلل — لا فائدة من تمرير تعبير غير صالح إلى مُجدِّل. في مسارات CI/CD، يمنع التحقق الآلي من تعبيرات cron دمج جداول معطوبة في ملفات الإعداد.
لماذا تستخدم هذا المحقق؟
تعبير cron له قواعد صارمة لبناء الجملة، والمُجدِّلات تُعطي رسائل خطأ غير متسقة عند كسر تلك القواعد. بعض المُجدِّلات ترفض التعبير بخطأ غامض؛ وبعضها يقبله بصمت ولا يُشغِّله أبداً. يمنحك هذا المحقق تشخيصاً واضحاً حقلاً بحقل قبل النشر.
حالات استخدام محقق Cron
أخطاء بناء جملة Cron الشائعة
يسرد الجدول أدناه أكثر أخطاء تعبيرات cron تكراراً وما يتسبب فيها. هذه هي الأخطاء التي تظهر مراراً في إعدادات الإنتاج ومسارات 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"