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式は5つのスペース区切りフィールド(分、時、日、月、曜日)を使って繰り返しスケジュールを定義します。いずれかのフィールドに範囲外の値、無効な演算子、またはフィールド数の過不足のような構造的エラーが含まれている場合、その式はデプロイ時にスケジューラから拒否されるか、トリガー時刻に一致せずサイレントに失敗します。
Cron式をオンラインで検証することで、本番環境へのデプロイ後にジョブが実行されないと気づくよりも早くエラーを検出できます。よくある間違いには、時フィールドに25を書く(有効範囲は0〜23)、ステップをゼロにする(*/0は未定義)、範囲の上下を逆にする(1-5ではなく5-1と書く)、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でCron式をプログラム的に検証する方法です。各例では無効な構文を検出し、意味のあるエラーメッセージを取得する方法を示しています。
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"