Validator Ekspresi Cron
Validasi ekspresi cron dan tampilkan rincian bidang demi bidang yang terperinci
Ekspresi cron
minute hour day(month) month day(week)
Rincian bidang
*/15(0โ59)Berkembang menjadi: 0, 15, 30, 45
0-6(0โ23)Berkembang menjadi: 0, 1, 2, 3, 4, 5, 6
1,15(1โ31)Berkembang menjadi: 1, 15
*(1โ12)Berkembang menjadi: all (1โ12)
1-5(0โ6)Berkembang menjadi: 1, 2, 3, 4, 5
Apa Itu Validasi Cron Expression?
Validasi cron expression adalah proses pemeriksaan apakah sebuah string cron mengikuti aturan sintaks yang benar sebelum diserahkan ke scheduler. Cron expression menggunakan lima field yang dipisahkan spasi (menit, jam, hari-dalam-bulan, bulan, hari-dalam-minggu) untuk mendefinisikan jadwal berulang. Jika ada field yang mengandung nilai di luar rentang yang diizinkan, operator yang tidak valid, atau kesalahan struktural seperti jumlah field yang salah, expression tersebut akan ditolak oleh scheduler pada waktu deployment atau gagal secara diam-diam tanpa pernah memicu eksekusi.
Memvalidasi cron expression secara online mendeteksi kesalahan lebih awal daripada melakukan deployment ke produksi dan menunggu job yang terlewat. Kesalahan umum mencakup menulis 25 di field jam (rentang valid: 0-23), menggunakan nilai step nol (*/0, yang tidak terdefinisi), membalikkan batas rentang (5-1 alih-alih 1-5), atau menambahkan field tambahan yang termasuk format non-standar seperti Quartz. Pemeriksa sintaks menandai masalah-masalah ini seketika dan memberi tahu Anda field mana yang salah.
Validasi cron berbeda dari penguraian cron. Parser mengambil expression yang valid dan menerjemahkannya menjadi jadwal yang mudah dibaca. Validator menjawab pertanyaan yang lebih sederhana: apakah expression ini terbentuk dengan benar? Validasi dilakukan sebelum parsing โ tidak ada gunanya memberikan expression yang tidak valid ke scheduler. Dalam pipeline CI/CD, validasi cron otomatis mencegah jadwal yang rusak digabungkan ke dalam file konfigurasi.
Mengapa Menggunakan Cron Validator Ini?
Cron expression memiliki aturan sintaks yang ketat, dan scheduler memberikan pesan kesalahan yang tidak konsisten ketika aturan tersebut dilanggar. Beberapa scheduler menolak expression dengan pesan kesalahan yang tidak jelas; yang lain menerimanya secara diam-diam dan tidak pernah dieksekusi. Validator ini memberikan diagnosis yang jelas, field per field, sebelum Anda melakukan deployment.
Kasus Penggunaan Cron Validator
Kesalahan Sintaks Cron yang Umum
Tabel di bawah ini mencantumkan kesalahan cron expression yang paling sering terjadi dan penyebabnya. Ini adalah kesalahan yang berulang kali muncul dalam konfigurasi produksi dan pipeline CI/CD.
| Jenis kesalahan | Contoh | Yang salah |
|---|---|---|
| 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 Expression Valid vs. Tidak Valid
Referensi cepat expression yang terbentuk dengan benar beserta kesalahan umum. Gunakan ini untuk memverifikasi expression Anda sebelum menempelkannya ke konfigurasi scheduler.
Contoh Kode
Cara memvalidasi cron expression secara programatik dalam JavaScript, Python, Go, dan Bash. Setiap contoh menunjukkan cara menangkap sintaks yang tidak valid dan mengekstrak pesan kesalahan yang bermakna.
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"