Validador de Expressões Cron
Valide expressões cron e veja um detalhamento campo a campo
Expressão cron
minute hour day(month) month day(week)
Detalhamento dos campos
*/15(0–59)Expande para: 0, 15, 30, 45
0-6(0–23)Expande para: 0, 1, 2, 3, 4, 5, 6
1,15(1–31)Expande para: 1, 15
*(1–12)Expande para: all (1–12)
1-5(0–6)Expande para: 1, 2, 3, 4, 5
O Que É a Validação de Expressões Cron?
A validação de expressões cron é o processo de verificar se uma string cron segue as regras de sintaxe corretas antes de chegar a um agendador. Uma expressão cron usa cinco campos separados por espaços (minuto, hora, dia do mês, mês, dia da semana) para definir um agendamento recorrente. Se algum campo contiver um valor fora do intervalo permitido, um operador inválido ou um erro estrutural como número incorreto de campos, a expressão será rejeitada pelo agendador no momento da implantação ou falhará silenciosamente sem corresponder a nenhum horário.
Validar uma expressão cron online detecta erros mais cedo do que implantar em produção e aguardar um job perdido. Erros típicos incluem escrever 25 no campo de hora (intervalo válido: 0-23), usar um passo de zero (*/0, que é indefinido), inverter os limites de um intervalo (5-1 em vez de 1-5), ou adicionar campos extras que pertencem a formatos não padrão como o Quartz. Um verificador de sintaxe sinaliza esses problemas instantaneamente e indica exatamente qual campo está errado.
A validação cron difere da análise cron. Um analisador pega uma expressão válida e a converte em um agendamento legível. Um validador responde a uma pergunta mais simples: esta expressão está bem formada? Valide antes de analisar — não faz sentido passar uma expressão inválida para um agendador. Em pipelines de CI/CD, a validação automatizada de cron impede que agendamentos quebrados sejam incorporados a arquivos de configuração.
Por Que Usar Este Validador Cron?
Uma expressão cron tem regras de sintaxe estritas, e os agendadores fornecem mensagens de erro inconsistentes quando essas regras são violadas. Alguns rejeitam a expressão com um erro críptico; outros a aceitam silenciosamente e nunca a disparam. Este validador fornece um diagnóstico claro, campo a campo, antes de você implantar.
Casos de Uso do Validador Cron
Erros Comuns de Sintaxe Cron
A tabela abaixo lista os erros mais frequentes em expressões cron e o que os causa. São os erros que aparecem repetidamente em configurações de produção e pipelines de CI/CD.
| Tipo de erro | Exemplo | O que deu errado |
|---|---|---|
| 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. |
Expressões Cron Válidas vs. Inválidas
Uma referência rápida de expressões bem formadas ao lado de erros comuns. Use para verificar sua expressão antes de colá-la em uma configuração de agendador.
Exemplos de Código
Como validar expressões cron programaticamente em JavaScript, Python, Go e Bash. Cada exemplo mostra como capturar sintaxe inválida e extrair uma mensagem de erro significativa.
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"