Walidator wyrażeń Cron
Waliduj wyrażenia cron i uzyskaj szczegółowy podział pole po polu
Wyrażenie cron
minute hour day(month) month day(week)
Podział pól
*/15(0–59)Rozwinięcie: 0, 15, 30, 45
0-6(0–23)Rozwinięcie: 0, 1, 2, 3, 4, 5, 6
1,15(1–31)Rozwinięcie: 1, 15
*(1–12)Rozwinięcie: all (1–12)
1-5(0–6)Rozwinięcie: 1, 2, 3, 4, 5
Czym jest walidacja wyrażeń cron?
Walidacja wyrażeń cron to proces sprawdzania, czy ciąg cron spełnia poprawne reguły składniowe, zanim trafi do harmonogramera. Wyrażenie cron składa się z pięciu pól oddzielonych spacjami (minuta, godzina, dzień-miesiąca, miesiąc, dzień-tygodnia), które definiują harmonogram cykliczny. Jeśli którekolwiek pole zawiera wartość spoza dopuszczalnego zakresu, nieprawidłowy operator lub błąd strukturalny — na przykład niewłaściwą liczbę pól — wyrażenie zostanie odrzucone przez harmonogramer w momencie wdrożenia albo po cichu nie dopasuje żadnego czasu wyzwalacza.
Walidacja wyrażenia cron online pozwala wychwycić błędy wcześniej niż wdrożenie na produkcji i oczekiwanie na pominięte zadanie. Typowe pomyłki to: wpisanie 25 w polu godziny (dopuszczalny zakres: 0-23), użycie kroku zero (*/0, co jest niezdefiniowane), odwrócenie granic zakresu (5-1 zamiast 1-5) lub dodanie dodatkowych pól charakterystycznych dla niestandardowych formatów, takich jak Quartz. Walidator natychmiast sygnalizuje te problemy i wskazuje dokładnie, które pole jest niepoprawne.
Walidacja cron różni się od parsowania cron. Parser przyjmuje poprawne wyrażenie i tłumaczy je na czytelny opis harmonogramu. Walidator odpowiada na prostsze pytanie: czy to wyrażenie jest poprawnie zbudowane? Waliduj przed parsowaniem — przekazywanie nieprawidłowego wyrażenia do harmonogramera nie ma sensu. W potokach CI/CD automatyczna walidacja cron zapobiega trafianiu uszkodzonych harmonogramów do plików konfiguracyjnych.
Dlaczego warto używać tego walidatora cron?
Wyrażenie cron podlega ścisłym regułom składniowym, a harmonogramery zwracają niespójne komunikaty błędów, gdy te reguły są naruszane. Niektóre harmonogramery odrzucają wyrażenie z niejasnym błędem, inne przyjmują je po cichu i nigdy nie wykonują. Ten walidator dostarcza przejrzystej diagnozy pole po polu, zanim przeprowadzisz wdrożenie.
Przypadki użycia walidatora cron
Typowe błędy składni cron
Poniższa tabela zawiera najczęstsze błędy wyrażeń cron i ich przyczyny. To pomyłki, które regularnie pojawiają się w konfiguracjach produkcyjnych i potokach CI/CD.
| Typ błędu | Przykład | Co poszło nie tak |
|---|---|---|
| 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. |
Poprawne vs. niepoprawne wyrażenia cron
Krótki przewodnik po poprawnie zbudowanych wyrażeniach zestawionych z typowymi błędami. Użyj go, aby szybko sprawdzić wyrażenie przed wklejeniem go do konfiguracji harmonogramera.
Przykłady kodu
Jak programowo walidować wyrażenia cron w JavaScript, Python, Go i Bash. Każdy przykład pokazuje, jak przechwycić nieprawidłową składnię i uzyskać czytelny komunikat błędu.
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"