محقق تعبيرات Cron

يتحقق من صحة تعبيرات cron ويعرض تحليلاً تفصيلياً حقلاً بحقل

جرب مثالاً

تعبير cron

minute hour day(month) month day(week)

تعبير cron صحيح

تفصيل الحقول

Minute*/15(0–59)

يتوسع إلى: 0, 15, 30, 45

Hour0-6(0–23)

يتوسع إلى: 0, 1, 2, 3, 4, 5, 6

Day of month1,15(1–31)

يتوسع إلى: 1, 15

Month*(1–12)

يتوسع إلى: all (1–12)

Day of week1-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 وإعدادات الجدول لا تُرسَل إلى أي خادم ولا تُخزَّن في أي مكان.
🔍
تقرير الأخطاء حقلاً بحقل
عندما يكون التعبير غير صالح، يُحدِّد المحقق الحقل الذي تسبب في الخطأ والسبب. بدون تخمين أي من الحقول الخمسة فيه المشكلة.
📋
لا حساب مطلوب
افتح الصفحة وابدأ الفحص. بدون تسجيل دخول، بدون مفتاح API، بدون تثبيت. يعمل على أي جهاز بمتصفح حديث، بما في ذلك الجوال.

حالات استخدام محقق Cron

مطور واجهة أمامية
تحقق من صحة تعبيرات cron التي يُدخلها المستخدمون في واجهات الجدولة قبل حفظها في قاعدة البيانات. التقط أخطاء بناء الجملة على جانب العميل بدلاً من الانتظار حتى يرفضها الخادم.
مهندس خلفية
تحقق من تعبيرات cron في إعدادات قوائم المهام (Celery beat، Hangfire، Quartz) أثناء مراجعة الكود. تأكد أن سلسلة الجدول بعد إعادة الهيكلة لا تزال تجتاز التحقق من بناء الجملة.
DevOps / SRE
تحقق من جداول cron في مواصفات Kubernetes CronJob وإعدادات مسارات CI/CD قبل تطبيقها. امنع خطأً مطبعياً في جدول النسخ الاحتياطي من أن يمر دون أن يُلاحَظ حتى يضيع النسخ الاحتياطي.
مهندس ضمان جودة
اختبر أن تطبيقك يرفض مدخلات cron غير الصالحة بشكل صحيح. أنشئ تعبيرات معطوبة معروفة (قيم خارج النطاق، عدد حقول خاطئ) وتأكد أن معالجة الأخطاء تعمل.
مهندس بيانات
تحقق من مُشغِّلات cron لمسارات Airflow DAG وجلسات dbt المجدولة. تأكد أن جداول المسارات المُستخرَجة من ملفات إعداد YAML أو JSON صحيحة نحوياً قبل النشر.
طالب / متعلم
جرِّب صيغة cron واحصل على تغذية راجعة فورية حول ما هو صالح وما يُسبب خطأ. تعلَّم نطاقات الحقول والمُشغِّلات والحالات الحدية باختبار التعبيرات وقراءة رسائل الخطأ.

أخطاء بناء جملة Cron الشائعة

يسرد الجدول أدناه أكثر أخطاء تعبيرات cron تكراراً وما يتسبب فيها. هذه هي الأخطاء التي تظهر مراراً في إعدادات الإنتاج ومسارات CI/CD.

نوع الخطأمثالالسبب
Too few fields0 9 * *Missing the day-of-week field. Standard cron requires exactly 5 fields.
Too many fields0 0 9 * * 1 2026Extra fields. Some tools add seconds or year, but standard cron uses 5.
Value out of range0 25 * * *Hour field accepts 0-23. Value 25 exceeds the maximum.
Invalid step base0 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 field0 9 * * 1Double space creates an empty field. Each field needs a value.
Invalid character0 9 * * Mon-FryTypo in day name. Use three-letter abbreviations: MON, TUE, WED, THU, FRI, SAT, SUN.
Reversed range0 9 * * 5-1Range end (1) is less than start (5). Write 1-5 or use a list: 5,6,0,1.

تعبيرات Cron الصالحة مقابل غير الصالحة

مرجع سريع للتعبيرات المُكوَّنة بشكل صحيح إلى جانب الأخطاء الشائعة. استخدم هذا للتحقق السريع من تعبيرك قبل لصقه في إعداد مُجدِّل.

التعبيرات الصالحة
* * * * *
0 9 * * 1-5
*/15 * * * *
0 0 1,15 * *
30 2 * * 0
0 */6 * * *
التعبيرات غير الصالحة
0 9 * *4 حقول، المطلوب 5
0 25 * * *الحد الأقصى لحقل الساعة هو 23
*/0 * * * *قيمة الخطوة لا يمكن أن تكون 0
0 9 * * 8الحد الأقصى ليوم الأسبوع هو 6
60 * * * *الحد الأقصى لحقل الدقيقة هو 59
0 0 0 * *الحد الأدنى ليوم الشهر هو 1

أمثلة برمجية

كيفية التحقق من صحة تعبيرات cron برمجياً في JavaScript و Python و Go و Bash. يُوضح كل مثال كيفية التقاط بناء جملة غير صالح واستخراج رسالة خطأ ذات معنى.

JavaScript (Node.js)
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)
Python
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}")
Go
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)
        }
    }
}
Bash
#!/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"

الأسئلة الشائعة

ما الذي يجعل تعبير cron غير صالح؟
يكون تعبير cron غير صالح عندما يكسر قواعد بناء الجملة للصيغة ذات الخمسة حقول. الأسباب الشائعة: عدد خاطئ من الحقول (أقل من 5 أو أكثر من 5 لـ cron القياسي)، أو قيمة خارج النطاق المسموح به (مثل الساعة 25، أو الدقيقة 60، أو يوم الشهر 0)، أو خطوة بقيمة صفر (*/0)، أو عكس حدود النطاق (5-1)، أو أحرف غير معروفة. يجب أن يحتوي التعبير على خمسة حقول مفصولة بمسافات بالضبط مع قيم ومُشغِّلات صالحة في كل منها.
هل تعبير cron صالح إذا لم يُشغَّل أبداً؟
نعم، نحوياً. تعبير مثل 0 0 31 2 * (31 فبراير) يجتاز التحقق من بناء الجملة لأن كل حقل يحتوي على قيم ضمن النطاقات المسموح بها. لكنه لن يُشغَّل أبداً لأن فبراير لا يملك 31 يوماً. معظم المحققين يفحصون بناء الجملة فقط، وليس الصحة الدلالية. إذا كنت تريد رصد الجداول التي لا يمكن الوصول إليها، احسب أوقات التشغيل الـ N التالية وتحقق ما إذا كانت القائمة فارغة.
كيف أتحقق من صحة تعبير cron بـ 6 أو 7 حقول؟
POSIX القياسي يستخدم 5 حقول. يُضيف Quartz Scheduler حقل ثوانٍ في البداية (6 حقول) وحقل سنة اختيارياً في النهاية (7 حقول). يستخدم AWS EventBridge 6 حقول. يتحقق هذا المحقق من الصيغة القياسية ذات 5 حقول. للتحقق من تعبيرات Quartz أو EventBridge، استخدم مكتبة تدعم الصيغة الموسَّعة، مثل cron-parser مع خيار extended في Node.js أو quartz-cron في Java.
هل يمكن استخدام أسماء الأيام والشهور في تعبيرات cron؟
معظم تطبيقات cron تقبل اختصارات إنجليزية من ثلاثة أحرف للشهور (JAN-DEC) وأيام الأسبوع (SUN-SAT). هذه الاختصارات غير حساسة لحالة الأحرف في crontab لكن قد تكون حساسة في أنظمة أخرى. لا يمكن استخدام القيم المسماة في النطاقات على جميع المنصات: MON-FRI يعمل في crontab لكن ليس في كل مكتبة. إذا كانت قابلية النقل مهمة، استخدم القيم الرقمية (1-5 للاثنين إلى الجمعة).
لماذا يعمل تعبير cron في crontab لكنه يفشل في Kubernetes؟
تستخدم Kubernetes CronJobs نفس الصيغة ذات 5 حقول مثل crontab لكنها تُحلَّل بواسطة مكتبة cron الخاصة بـ Go التي لها تحقق أكثر صرامة. التعبيرات التي يتسامح معها crontab (مثل المسافات الزائدة في النهاية، أو تعيين كلٍّ من يوم الشهر ويوم الأسبوع لقيم غير بدل) قد تتصرف بشكل مختلف. يعتمد Kubernetes أيضاً على المنطقة الزمنية لـ controller-manager (UTC عادةً)، وليس المنطقة الزمنية المحلية للعقدة. تحقق دائماً من التعبير مقابل المُجدِّل المحدد الذي تنشر إليه.
كيف أتحقق من صحة تعبيرات cron في مسار CI/CD؟
أضف خطوة تحقق تعمل قبل النشر. في مشروع Node.js، استخدم cron-parser أو cron-validator في ملف اختبار يقرأ سلاسل cron من إعدادك ويؤكد أنها تُحلَّل بدون خطأ. في Python، استخدم croniter.is_valid(). في سكريبت shell، استدعِ دالة التحقق وأنهِ بكود غير صفري عند الفشل. هذا يرصد الأخطاء المطبعية وأخطاء النسخ واللصق قبل أن تصل إلى الإنتاج.
ما الفرق بين التحقق من صحة cron وفحص جودته؟
التحقق يفحص ما إذا كان التعبير صحيحاً نحوياً: عدد الحقول صحيح، والقيم ضمن النطاق، والمُشغِّلات صالحة. أما فحص الجودة فيذهب أبعد من ذلك بفحص الأخطاء المحتملة التي هي تقنياً صالحة: الجداول التي لا تُشغَّل أبداً (31 فبراير)، والمهام المتداخلة، وقيم الخطوة التي تتخطى فترات متوقعة (*/7 يُعيد التعيين كل ساعة)، أو الجداول بدون توثيق للمنطقة الزمنية. التحقق يجيب على 'هل سيُحلَّل هذا؟' وفحص الجودة يجيب على 'هل هذا على الأرجح ما تقصده؟'