Validate cron syntax, get human-readable explanations, calculate next run times, and lint for common mistakes.
bash
# Single expression
python3 scripts/cron_check.py validate "*/15 * * * *"
# Multiple expressions with lint
python3 scripts/cron_check.py validate --lint "0 2 * * *" "* * * * *" "0 0 31 2 *"
bash
python3 scripts/cron_check.py explain "30 4 1,15 * 1-5"
bash
# Next 5 runs (default)
python3 scripts/cron_check.py next "0 9 * * 1-5"
# Next 10 runs
python3 scripts/cron_check.py next "0 */6 * * *" --count 10
# From specific time
python3 scripts/cron_check.py next "0 9 * * *" --from-time 2026-01-01T00:00:00
bash
# Check for common mistakes
python3 scripts/cron_check.py lint "* * * * *" "0 0 31 2 *" "0 0 29 2 *"
# Strict mode (exit 1 on warnings)
python3 scripts/cron_check.py lint --strict "0 0 31 4 *"
bash
python3 scripts/cron_check.py -f json explain "0 9 * * 1-5"
python3 scripts/cron_check.py -f markdown validate --lint "*/5 * * * *"
FeatureExampleDescriptionWildcard*Every valueSpecific5Exact valueRange1-5Values 1 through 5List1,3,5Values 1, 3, and 5Step*/15Every 15th valueRange+Step1-30/2Odd values 1-30Namesmon-friDay/month namesShortcuts@dailyPredefined schedules
ShortcutEquivalentMeaning@yearly``0 0 1 1 *Once a year@monthly``0 0 1 * *First of month@weekly``0 0 * * 0Every Sunday@daily``0 0 * * *Every midnight@hourly``0 * * * *Every hour
CheckLevelDescriptionEvery-minuteWarning* * * * * runs 1440 times/dayDay 31 in short monthsWarningApr, Jun, Sep, Nov have 30 daysFeb 29-31WarningOnly runs in leap years (29) or neverDOM + DOW conflictInfoBoth specified = OR logicHigh frequencyInfoMore than 288 runs/day