Cron İfadesi Doğrulayıcı
Cron ifadelerini doğrula ve alan-alan ayrıntılı dökümü göster
Cron ifadesi
minute hour day(month) month day(week)
Alan dökümü
*/15(0–59)Açılımı: 0, 15, 30, 45
0-6(0–23)Açılımı: 0, 1, 2, 3, 4, 5, 6
1,15(1–31)Açılımı: 1, 15
*(1–12)Açılımı: all (1–12)
1-5(0–6)Açılımı: 1, 2, 3, 4, 5
Cron İfadesi Doğrulama Nedir?
Cron ifadesi doğrulama, bir cron dizesinin zamanlayıcıya ulaşmadan önce doğru sözdizimi kurallarına uyup uymadığını kontrol etme sürecidir. Cron ifadesi; tekrarlayan bir zamanlamayı tanımlamak için boşlukla ayrılmış beş alan (dakika, saat, ayın günü, ay, haftanın günü) kullanır. Herhangi bir alan izin verilen aralık dışında bir değer, geçersiz bir operatör veya yanlış alan sayısı gibi yapısal bir hata içeriyorsa, ifade ya dağıtım sırasında zamanlayıcı tarafından reddedilir ya da sessizce herhangi bir tetikleyici zamanıyla eşleşmeden başarısız olur.
Cron ifadesini çevrimiçi doğrulamak, üretime dağıtıp kaçırılan bir işi beklemeye kıyasla hataları çok daha erken yakalar. Yaygın hatalar arasında saat alanına 25 yazmak (geçerli aralık: 0-23), sıfır adım kullanmak (*/0, tanımsızdır), aralık sınırlarını ters yazmak (1-5 yerine 5-1) ya da Quartz gibi standart dışı formatlara ait ek alanlar eklemek yer alır. Bir sözdizimi denetleyicisi bu sorunları anında işaretler ve tam olarak hangi alanın hatalı olduğunu söyler.
Cron doğrulama, cron ayrıştırmadan farklıdır. Ayrıştırıcı geçerli bir ifadeyi alıp insan tarafından okunabilir bir zamanlamaya çevirir. Doğrulayıcı daha basit bir soruyu yanıtlar: bu ifade doğru biçimlendirilmiş mi? Ayrıştırmadan önce doğrulayın — geçersiz bir ifadeyi zamanlayıcıya göndermek anlamsızdır. CI/CD pipeline'larında otomatik cron doğrulama, bozuk zamanlamaların yapılandırma dosyalarına birleştirilmesini önler.
Bu Cron Doğrulayıcıyı Neden Kullanmalısınız?
Cron ifadesinin katı sözdizimi kuralları vardır ve zamanlayıcılar bu kurallar ihlal edildiğinde tutarsız hata mesajları verir. Bazı zamanlayıcılar ifadeyi şifreli bir hatayla reddeder; diğerleri sessizce kabul eder ve hiç çalıştırmaz. Bu doğrulayıcı, dağıtımdan önce size net, alan alan bir analiz sunar.
Cron Doğrulayıcı Kullanım Senaryoları
Yaygın Cron Sözdizimi Hataları
Aşağıdaki tablo en sık karşılaşılan cron ifadesi hatalarını ve nedenlerini listeler. Bunlar üretim yapılandırmalarında ve CI/CD pipeline'larında tekrar tekrar karşılaşılan hatalar.
| Hata türü | Örnek | Ne yanlış gitti |
|---|---|---|
| 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. |
Geçerli ve Geçersiz Cron İfadeleri
Yaygın hatalarla birlikte doğru biçimlendirilmiş ifadelere hızlı bir başvuru. Bir zamanlayıcı yapılandırmasına yapıştırmadan önce ifadenizi kontrol etmek için kullanın.
Kod Örnekleri
JavaScript, Python, Go ve Bash'te cron ifadelerini programatik olarak doğrulama. Her örnek, geçersiz sözdiziminin nasıl yakalanacağını ve anlamlı bir hata mesajının nasıl çıkarılacağını gösterir.
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"