Cron Expression Validator
Перевіряє 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 відрізняється від розбору cron. Парсер бере валідний вираз і перетворює його на зрозумілий опис розкладу. Валідатор відповідає на простіше питання: чи правильно сформований цей вираз? Спочатку перевіряйте, потім розбирайте — немає сенсу передавати невалідний вираз планувальнику. У CI/CD-пайплайнах автоматична валідація cron запобігає потраплянню несправних розкладів у файли конфігурації.
Навіщо використовувати цей валідатор 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"