ToolDeck

اعتبارسنج عبارت 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 خطاها را زودتر از استقرار در محیط تولید و بدون اینکه بفهمید کار اجرا نشده شناسایی می‌کند. اشتباهات رایج شامل نوشتن ۲۵ در فیلد ساعت (محدوده معتبر: ۰-۲۳)، استفاده از گام صفر (*/0 که تعریف‌نشده است)، معکوس کردن مرزهای محدوده (5-1 به جای 1-5)، یا افزودن فیلدهای اضافه که به قالب‌های غیراستاندارد مانند Quartz تعلق دارند می‌شود. یک بررسی‌کننده نحو این مشکلات را فوری شناسایی کرده و دقیقاً می‌گوید کدام فیلد نادرست است.

اعتبارسنجی cron با تجزیه cron تفاوت دارد. یک تجزیه‌کننده عبارت معتبر را می‌گیرد و آن را به یک برنامه قابل خواندن تبدیل می‌کند. یک اعتبارسنج به سوال ساده‌تری پاسخ می‌دهد: آیا این عبارت صحیح است؟ پیش از تجزیه اعتبارسنجی کنید — ارسال یک عبارت نامعتبر به زمان‌بند بی‌فایده است. در pipeline‌های CI/CD، اعتبارسنجی خودکار cron از ادغام برنامه‌های خراب در فایل‌های پیکربندی جلوگیری می‌کند.

چرا از این اعتبارسنج Cron استفاده کنیم؟

عبارت cron قوانین نحوی سختگیرانه‌ای دارد و زمان‌بندها هنگام نقض این قوانین پیام‌های خطای ناسازگاری ارائه می‌دهند. برخی زمان‌بندها عبارت را با خطایی مبهم رد می‌کنند؛ برخی دیگر آن را بی‌صدا قبول می‌کنند و هرگز اجرا نمی‌شوند. این اعتبارسنج پیش از استقرار یک تشخیص واضح فیلد به فیلد به شما می‌دهد.

بررسی نحو فوری
یک عبارت cron را وارد کنید یا بنویسید و بلافاصله ببینید آیا اعتبارسنجی را پشت سر می‌گذارد. بدون ارسال فرم، بدون تأخیر. نتیجه همزمان با تایپ به‌روز می‌شود.
🔒
پردازش کاملاً محلی
اعتبارسنجی کاملاً در مرورگر شما اجرا می‌شود. عبارات cron و پیکربندی‌های برنامه شما هرگز به سروری ارسال یا در جایی ذخیره نمی‌شوند.
🔍
گزارش خطای فیلد به فیلد
وقتی عبارتی نامعتبر است، اعتبارسنج مشخص می‌کند کدام فیلد باعث خطا شده و چرا. نیازی به حدس زدن نیست که کدام یک از پنج فیلد مشکل دارد.
📋
بدون نیاز به حساب کاربری
صفحه را باز کنید و شروع به بررسی کنید. بدون ورود به سیستم، بدون کلید API، بدون نصب. روی هر دستگاهی با مرورگر مدرن، از جمله موبایل، کار می‌کند.

موارد استفاده اعتبارسنج Cron

توسعه‌دهنده فرانت‌اند
عبارات cron وارد‌شده توسط کاربران در رابط‌های کاربری برنامه‌ریزی را پیش از ذخیره در پایگاه داده اعتبارسنجی کنید. خطاهای نحوی را در سمت کلاینت بگیرید به جای اینکه منتظر رد شدن از سمت بک‌اند بمانید.
مهندس بک‌اند
عبارات cron در پیکربندی‌های صف وظایف (Celery beat، Hangfire، Quartz) را در حین بررسی کد بسنجید. تأیید کنید که یک رشته برنامه بازنویسی‌شده همچنان اعتبارسنجی نحو را پشت سر می‌گذارد.
DevOps / SRE
برنامه‌های cron در مانیفست‌های Kubernetes CronJob و پیکربندی‌های pipeline CI/CD را پیش از اعمال اعتبارسنجی کنید. از نادیده گرفته شدن یک غلط تایپی در برنامه پشتیبان‌گیری تا زمان از دست رفتن پشتیبان جلوگیری کنید.
مهندس QA
آزمایش کنید که برنامه شما ورودی cron نامعتبر را به درستی رد می‌کند. عبارات شناخته‌شده نادرست (مقادیر خارج از محدوده، تعداد فیلد اشتباه) تولید کنید و تأیید کنید که مدیریت خطا کار می‌کند.
مهندس داده
تریگرهای cron برای Airflow DAG‌ها و اجراهای زمان‌بندی‌شده dbt را اعتبارسنجی کنید. تأیید کنید که برنامه‌های pipeline تجزیه‌شده از فایل‌های پیکربندی YAML یا JSON از نظر نحوی صحیح هستند پیش از استقرار.
دانشجو / یادگیرنده
با نحو cron آزمایش کنید و بازخورد فوری در مورد آنچه معتبر است و آنچه خطا می‌دهد دریافت کنید. محدوده‌های فیلد، عملگرها و موارد خاص را با آزمایش عبارات و خواندن پیام‌های خطا یاد بگیرید.

خطاهای رایج نحو Cron

جدول زیر متداول‌ترین خطاهای عبارت cron و دلایل آن‌ها را فهرست می‌کند. اینها اشتباهاتی هستند که به طور مکرر در پیکربندی‌های محیط تولید و pipeline‌های 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 * *۴ فیلد، نیاز به ۵ فیلد
0 25 * * *حداکثر ساعت ۲۳ است
*/0 * * * *گام نمی‌تواند ۰ باشد
0 9 * * 8حداکثر روز هفته ۶ است
60 * * * *حداکثر دقیقه ۵۹ است
0 0 0 * *حداقل روز ماه ۱ است

نمونه‌های کد

نحوه اعتبارسنجی عبارات 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 هنگامی نامعتبر است که قوانین نحوی قالب پنج‌فیلدی را نقض کند. دلایل رایج: تعداد اشتباه فیلدها (کمتر یا بیشتر از ۵ برای cron استاندارد)، مقداری خارج از محدوده مجاز (مانند ساعت ۲۵، دقیقه ۶۰، روز ماه ۰)، گام صفر (*/0)، معکوس کردن مرزهای محدوده (5-1)، یا کاراکترهای ناشناخته. عبارت باید دقیقاً پنج فیلد جداشده با فاصله با مقادیر و عملگرهای معتبر در هر یک داشته باشد.
آیا یک عبارت cron که هرگز اجرا نمی‌شود معتبر است؟
بله، از نظر نحوی. عبارتی مانند 0 0 31 2 * (۳۱ فوریه) اعتبارسنجی نحو را پشت سر می‌گذارد زیرا هر فیلد مقادیری در محدوده مجاز دارد. اما هرگز اجرا نخواهد شد چون فوریه هرگز ۳۱ روز ندارد. اکثر اعتبارسنج‌ها فقط نحو را بررسی می‌کنند نه صحت معنایی. اگر نیاز به تشخیص زمان‌بندی‌های غیرممکن دارید، N زمان اجرای بعدی را محاسبه کرده و بررسی کنید که آیا فهرست خالی است.
چگونه یک عبارت cron با ۶ یا ۷ فیلد را اعتبارسنجی کنم؟
cron استاندارد POSIX از ۵ فیلد استفاده می‌کند. Quartz Scheduler یک فیلد ثانیه در ابتدا (۶ فیلد) و یک فیلد سال اختیاری در انتها (۷ فیلد) اضافه می‌کند. AWS EventBridge از ۶ فیلد استفاده می‌کند. این اعتبارسنج قالب استاندارد ۵ فیلدی را بررسی می‌کند. برای اعتبارسنجی عبارات 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 CronJob‌ها از همان قالب ۵ فیلدی crontab استفاده می‌کنند اما توسط کتابخانه cron زبان Go تجزیه می‌شوند که اعتبارسنجی سختگیرانه‌تری دارد. عباراتی که crontab آن‌ها را تحمل می‌کند (مانند فاصله انتهایی، یا تنظیم هر دو روز ماه و روز هفته بر مقادیر غیر-wildcard) ممکن است رفتار متفاوتی داشته باشند. Kubernetes همچنین به صورت پیش‌فرض از منطقه زمانی controller-manager (معمولاً UTC) استفاده می‌کند نه منطقه زمانی محلی گره. همیشه عبارت را در برابر زمان‌بند خاصی که روی آن استقرار می‌دهید اعتبارسنجی کنید.
چگونه باید عبارات cron را در یک pipeline CI/CD اعتبارسنجی کنم؟
یک مرحله اعتبارسنجی اضافه کنید که پیش از استقرار اجرا می‌شود. در یک پروژه Node.js، از cron-parser یا cron-validator در یک فایل آزمون استفاده کنید که رشته‌های cron را از پیکربندی شما می‌خواند و اثبات می‌کند که بدون خطا تجزیه می‌شوند. در Python از croniter.is_valid() استفاده کنید. در یک اسکریپت shell، تابع اعتبارسنجی را فراخوانی کرده و در صورت شکست با کد غیرصفر خارج شوید. این غلط‌های تایپی و خطاهای کپی-پیست را پیش از رسیدن به محیط تولید می‌گیرد.
تفاوت بین اعتبارسنجی cron و linting cron چیست؟
اعتبارسنجی بررسی می‌کند که آیا عبارت از نظر نحوی صحیح است: تعداد درست فیلدها، مقادیر در محدوده، عملگرهای معتبر. Linting فراتر می‌رود و اشتباهات احتمالی که از نظر فنی معتبر هستند را بررسی می‌کند: برنامه‌هایی که هرگز اجرا نمی‌شوند (۳۱ فوریه)، کارهای همپوشان، مقادیر گامی که بازه‌های مورد انتظار را رد می‌کنند (*/7 هر ساعت دور می‌زند)، یا برنامه‌هایی بدون مستندسازی منطقه زمانی. اعتبارسنجی به این سوال پاسخ می‌دهد که «آیا این تجزیه می‌شود؟» Linting پاسخ می‌دهد که «آیا این احتمالاً همان چیزی است که منظور داشتید؟»