Validatore di espressioni Cron
Valida espressioni cron e ottieni un'analisi dettagliata campo per campo
Espressione cron
minute hour day(month) month day(week)
Analisi dei campi
*/15(0–59)Corrisponde a: 0, 15, 30, 45
0-6(0–23)Corrisponde a: 0, 1, 2, 3, 4, 5, 6
1,15(1–31)Corrisponde a: 1, 15
*(1–12)Corrisponde a: all (1–12)
1-5(0–6)Corrisponde a: 1, 2, 3, 4, 5
Cos'è la validazione delle espressioni cron?
La validazione delle espressioni cron è il processo di verifica che una stringa cron rispetti le regole di sintassi corrette prima di raggiungere uno scheduler. Un'espressione cron usa cinque campi separati da spazi (minuto, ora, giorno del mese, mese, giorno della settimana) per definire una pianificazione ricorrente. Se un campo contiene un valore fuori range, un operatore non valido o un errore strutturale come il numero sbagliato di campi, l'espressione verrà rifiutata dallo scheduler al momento del deploy oppure fallirà silenziosamente senza corrispondere ad alcun orario di attivazione.
Validare un'espressione cron online individua gli errori prima del deploy in produzione, evitando di aspettare un job mancante. Gli errori tipici includono: scrivere 25 nel campo dell'ora (range valido: 0-23), usare un passo di zero (*/0, che è indefinito), invertire i limiti del range (5-1 invece di 1-5), o aggiungere campi extra appartenenti a formati non standard come Quartz. Un verificatore di sintassi individua questi problemi immediatamente e indica esattamente quale campo è errato.
La validazione cron è diversa dal parsing cron. Un parser prende un'espressione valida e la traduce in una pianificazione leggibile. Un validatore risponde a una domanda più semplice: l'espressione è ben formata? Valida prima di fare il parsing — non ha senso passare un'espressione non valida a uno scheduler. Nelle pipeline CI/CD, la validazione automatica delle espressioni cron impedisce che pianificazioni errate vengano inserite nei file di configurazione.
Perché usare questo validatore cron?
Un'espressione cron ha regole di sintassi rigide, e gli scheduler forniscono messaggi di errore inconsistenti quando tali regole vengono violate. Alcuni scheduler rifiutano l'espressione con un errore criptico; altri la accettano silenziosamente e non la eseguono mai. Questo validatore ti fornisce una diagnosi chiara, campo per campo, prima del deploy.
Casi d'uso del validatore cron
Errori comuni nella sintassi cron
La tabella seguente elenca gli errori più frequenti nelle espressioni cron e le loro cause. Questi sono gli errori che compaiono ripetutamente nelle configurazioni in produzione e nelle pipeline CI/CD.
| Tipo di errore | Esempio | Cosa è andato storto |
|---|---|---|
| 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. |
Espressioni cron valide e non valide
Un riferimento rapido di espressioni ben formate affiancate agli errori più comuni. Usalo per verificare rapidamente la tua espressione prima di incollarla in una configurazione dello scheduler.
Esempi di codice
Come validare espressioni cron a livello programmatico in JavaScript, Python, Go e Bash. Ogni esempio mostra come individuare la sintassi non valida ed estrarre un messaggio di errore significativo.
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"