İçeriğe geç

Cron ifadelerinde sık hatalar ve saat dilimi tuzakları

Gün ile haftanın gününün VEYA ile birleşmesi, adım değerlerinin saat başında sıfırlanması, 31. günlü ay tuzağı, UTC ile yerel saat farkı ve yaz saati geçişlerinde atlanan ya da çift çalışan işler.

2 dk okumaCron · Zamanlama · Saat dilimi · Entegrasyon

Zamanlanmış görevler (gece senkronu, rapor, yedek) çoğu entegrasyonun sessiz omurgasıdır. Cron ifadesi kısa olduğu için hatası da kolay gözden kaçar: ifade geçerlidir, görev çalışır, ama beklediğiniz zamanda çalışmaz. Aşağıdakiler standart beş alanlı ifade (dakika, saat, ayın günü, ay, haftanın günü) için en sık karşılaştığımız tuzaklardır.

1. Ayın günü ile haftanın günü VEYA'dır

"0 9 1 * 1" ifadesini "ayın 1'i pazartesi ise 09:00" diye okumak yaygın bir yanılgıdır. Her iki alan da kısıtlıysa klasik (Vixie) cron bunları VEYA ile birleştirir: görev ayın 1'inde ve ayrıca her pazartesi çalışır. İkisinden biri yıldızsa mantık VE'ye döner. "Ayın ilk pazartesisi" gibi bir koşul için ifade tek başına yetmez; görev içinde bugünün tarihini kontrol etmek gerekir.

2. Adım değeri saat başında sıfırlanır

"*/7 * * * *" yedi dakikada bir demek gibi görünür; gerçekte dakikalar 0, 7, 14, ... 56 olur ve ardından saat başında yeniden 0 gelir. Yani 56'dan sonraki aralık 4 dakikadır. Aralığın 60'ı bölmediği adımlar (7, 8, 25...) düzensiz çalışır. Gerçekten eşit aralık gerekiyorsa 60'ı bölen bir adım (5, 10, 15, 20, 30) seçin ya da zamanlayıcıyı "son çalışmadan beri" mantığıyla kurun.

3. 31. gün olmayan aylar

"0 0 31 * *" her ay değil, yalnızca 31 gün çeken yedi ayda çalışır. "Ay sonu" için genellikle ayın 28'i gibi güvenli bir gün seçilir ya da görev her gün çalışıp "yarın ayın 1'i mi" diye bakar. Şubat'ta 30 ve 31 hiç, 29 ise yalnızca artık yıllarda bulunur.

4. Saat dilimi: sunucu ne diyor?

Cron ifadesinin saat dilimi, görevin çalıştığı ortamın saat dilimidir ve çoğu bulut ortamında UTC'dir. UTC 06:00, Türkiye'de (UTC+3, yaz saati uygulaması yok) 09:00'dır. "Her sabah 09:00" için sunucu UTC ise ifade "0 6 * * *" olmalıdır. Ortam değiştiğinde (yerel makineden buluta) saat dilimi de değişir ve görev üç saat kayar. Bu yüzden ifadenin yanına hangi saat diliminde yazıldığını yorum olarak yazmak iyi bir alışkanlıktır.

5. Yaz saati geçişleri

Yaz saati uygulayan bir saat diliminde ilkbahar geçişinde bir saat yoktur: örneğin Almanya'da mart ayının son pazarı yerel saat 02:00'den 03:00'e atlar, "30 2 * * *" o gün çalışmayabilir. Sonbaharda bir saat iki kez yaşanır ve aynı görev iki kez çalışabilir. Davranış zamanlayıcıya göre değişir. Önlem: kritik işleri UTC'de planlayın ya da görevi tekrar çalıştırılsa zarar vermeyecek şekilde (idempotent) yazın.

6. Başka sistemlerin sözdizimi

Quartz ve benzeri araçlar saniye alanlı altı ya da yedi alanlı ifade kullanır; "?" "L" "W" gibi özel karakterleri vardır. Standart cron'a yapıştırılan böyle bir ifade geçersizdir ya da başka bir anlama gelir. Haftanın günü için 0 ve 7 pazar demektir; adlar (MON, JAN) her sistemde desteklenmeyebilir.

Çalıştırmadan önce görün

İfadeyi cron ifadesi çözümleyici aracına yazın: düz dille açıklar, saat dilimini seçerek sonraki 10 çalışma zamanını gösterir ve VEYA gibi tuzakları uyarır. Zaman damgalarını dönüştürmek için zaman damgası dönüştürücü, yeniden deneme davranışı için API yeniden deneme simülatörü var. Entegrasyon zamanlamanızı gözden geçirmek için bize yazın.

Bu konuyu kendi tesisiniz için konuşalım