Cron İfade Sözdizimi Açıklandı
Cron ifadeleri, geliştiricilerin bir kez öğrenip ayrıntıları unuttuğu ve sonra her altı ayda bir tekrar arattığı konulardan biridir. 30 9 * * 1-5 gibi beş karakterlik bir dizgi, şaşırtıcı derecede belirli bir zamanlamayı — "her iş günü sabah 9:30'da" — kodlayabilir, ancak sözdizimi gerçek karışıklığa neden olacak kadar uç durumlara sahiptir: 0 indeksli vs 1 indeksli alanlar, Pazar'ın hem 0 hem de 7 olması, Unix standardı ile Quartz'ın altı alanlı uzantısı arasındaki fark ve adım değerlerinin aralıklarla birleştirildiğindeki ince davranışı.
Bu kılavuz cron sözdizimini ilk prensiplerden kapsar, ardından her özel karakteri somut örneklerle işler. Bir Linux servisi için bir cron işi yazıyor, bir GitHub Actions zamanlaması yapılandırıyor veya bir AWS EventBridge kuralı oluşturuyor olun, aynı temel kavramlar uygulanır — yolda açıklanan birkaç önemli platform farkıyla.
Beş Standart Alan
Standart bir cron ifadesinin soldan sağa okunan boşlukla ayrılmış beş alanı vardır: dakika, saat, ayın günü, ay ve haftanın günü. Her alan, işin o boyutta ne zaman çalışacağını kısıtlar. Bir iş yalnızca beş alanın hepsi aynı anda eşleştiğinde çalışır.
# Alan Konum Aralık Özel karakterler
# ─────────────────────────────────────────────────
# Dakika 1 0-59 * / , -
# Saat 2 0-23 * / , -
# Ayın günü 3 1-31 * / , - ? L W
# Ay 4 1-12 veya JAN-DEC * / , -
# Haftanın günü 5 0-7 (0=7=Paz) veya SUN-SAT * / , - ? L # 30 9 * * 1-5 gibi bir ifadeyi okumak: dakika 30, saat 9, ayın herhangi bir günü, herhangi bir ay, haftanın 1'den 5'e kadar olan günleri (Pazartesi'den Cuma'ya). Sonuç: her iş günü sabah 9:30.
Alan 1: Dakika (0–59)
Dakika alanı işin hangi dakika(lar) saatte çalışması gerektiğini belirtir. 0 saatin tepesi anlamına gelir, 30 yarısı geçmiş anlamına gelir, 59 saat değişmeden bir dakika önce anlamına gelir. * kullanmak işi her dakika çalıştırır.
Alan 2: Saat (0–23)
Saatler 24 saatlik zamanı kullanır. 0 gece yarısı, 12 öğlen, 23 23:00'tür. Cron'da AM/PM yoktur — sabah 9:00'daki bir iş saat 9'dur ve akşam 9:00'daki bir iş saat 21'dir.
Alan 3: Ayın Günü (1–31)
Diğer alanların aksine, ayın günü 0'dan değil 1'den başlar. Geçerli değerler 1 ile 31 arasındadır. Belirli bir ayda var olmayan bir gün belirtirseniz (örneğin, Nisan'da 31. gün), iş o ay basitçe çalışmaz. Quartz'ta, özel karakter L, kaç gün olduğuna bakılmaksızın ayın son gününü temsil eder.
Alan 4: Ay (1–12)
Ay değerleri 1'den (Ocak) 12'ye (Aralık) kadar gider. Birçok zamanlayıcı üç harfli kısaltmaları da kabul eder: JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC. Bunlar çoğu uygulamada büyük/küçük harf duyarlı değildir.
Alan 5: Haftanın Günü (0–7)
Bu, en fazla tarihsel yüke sahip alandır. Hem 0 hem de 7 Pazar'ı temsil eder — bu, erken Unix'ten gelen bir uyumluluk tuhaflığıdır. Pazartesi 1, Salı 2, Cumartesi'ye kadar 6'dır. Üç harfli adlar da burada çalışır: SUN, MON, TUE, WED, THU, FRI, SAT.
Hem ayın günü hem de haftanın günü belirtildiğinde (hiçbiri * değil), çoğu Unix cron servisi VEYA mantığı kullanır: iş, herhangi biri eşleştiğinde çalışır. Bu birçok geliştiriciyi şaşırtır. "15'inde ancak yalnızca iş günüyse" istiyorsanız, bunu cron ifadesinde değil, iş betiğinde işlemeniz gerekir.
Özel Karakterler
Yıldız (*) — Her Değer
Yıldız bir alan için her geçerli değerle eşleşir. Dakika alanında, * 0'dan 59'a kadar olan dakikalar anlamına gelir. Ay alanında, 12 ayın tümü anlamına gelir. Cron ifadelerinde en yaygın karakterdir.
Eğik Çizgi (/) — Adım Değerleri
Eğik çizgi bir adım aralığı tanımlar. Dakika alanındaki */5 "her 5 dakikada bir" anlamına gelir. Daha kesin olarak, "aralıktaki ilk değerden başlayarak 5'e bölünebilen her değer" anlamına gelir. Yani dakikalardaki */5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55'e değerlendirilir.
Adımlar aralıklarla birleştirilebilir: dakika alanındaki 10-30/5, 10. dakika ile 30. dakika arasında her 5 dakikada bir anlamına gelir ve 10, 15, 20, 25, 30 verir. Adım, aralığın alt sınırından başlar.
Virgül (,) — Değerler Listesi
Virgüller belirli değerlerden oluşan bir liste oluşturur. Ay alanındaki 1,3,5 Ocak, Mart ve Mayıs anlamına gelir. Saat alanındaki 9,17 9:00 ve 17:00 anlamına gelir. İhtiyaç duyduğunuz kadar değer listeleyebilir ve bunları diğer yapılarla birleştirebilirsiniz.
Tire (-) — Aralık
Bir tire kapsayan bir aralığı belirtir. Haftanın günü alanındaki 1-5 Pazartesi'den Cuma'ya anlamına gelir. Saat alanındaki 9-17 sabah 9'dan akşam 5'e anlamına gelir. Aralıklar her iki uçta da kapsayıcıdır.
Soru İşareti (?) — Belirli Değer Yok (Yalnızca Quartz)
Standart Unix cron ?'yi desteklemez. Quartz Scheduler'da, "bu alan umurumda değil" anlamına gelmek için ayın günü veya haftanın günü alanlarında kullanılır. Quartz, ayın günü ile haftanın günü arasındaki çakışmaları her zaman çözemediği için, biri belirtildiğinde ikisinden birinin ? olarak ayarlanması gerekir. 0 0 15 * ? "her ayın 15'i, haftanın herhangi bir günü" anlamına gelir. 0 0 ? * MON "her Pazartesi, ayın herhangi bir günü" anlamına gelir.
L — Son (Yalnızca Quartz)
Ayın günü alanındaki L ayın son günü anlamına gelir. Haftanın günü alanındaki L Cumartesi anlamına gelir veya bir sayıyla birleştirildiğinde (örneğin, 5L), o haftanın gününün ayda son geçişi anlamına gelir. 5L ayın son Cuma günüdür.
W — En Yakın İş Günü (Yalnızca Quartz)
Ayın günü alanındaki W, verilen güne en yakın iş gününü (Pazartesi–Cuma) bulur. 15W 15'ine en yakın iş günü anlamına gelir. 15'i Cumartesi ise, iş 14'ünde (Cuma) çalışır. Pazar ise, 16'sında (Pazartesi) çalışır. W ay sınırlarını geçmez.
Diyez (#) — Ayın N'inci İş Günü (Yalnızca Quartz)
# bir ayda haftanın bir gününün N'inci geçişini belirtir. 5#2 ayın ikinci Cuma günü anlamına gelir. 2#1 ilk Salı anlamına gelir. Belirtilen geçiş belirli bir ayda yoksa, iş o ay çalışmaz.
Yaygın Cron Desenleri
# Her dakika
* * * * *
# Her gün gece yarısı (00:00)
0 0 * * *
# Her gün sabah 9:30'da
30 9 * * *
# Her Pazartesi sabah 8:00'de
0 8 * * 1
# Her ayın ilk günü öğlen
0 12 1 * *
# Her 15 dakikada bir
*/15 * * * *
# Hafta içi 18:00'de
0 18 * * 1-5 Bunların herhangi birini, herhangi bir ifade için sonraki beş çalıştırma zamanını gösteren ve geçersiz sözdizimini vurgulayan Cron Parser aracını kullanarak test edebilir ve doğrulayabilirsiniz. Belirli bir Unix zaman damgasının yerel saat diliminize karşılık geldiğini doğrulamanız gerekiyorsa Timestamp Converter'ı kullanın.
6 Alanlı Uzantı: Quartz Scheduler
Quartz Scheduler — Java ekosisteminde yoğun olarak kullanılır ve birçok kurumsal zamanlayıcı tarafından benimsenir — ifadenin başına zorunlu bir saniye alanı ekler. Format şu hale gelir: saniye dakika saat ayın-günü ay haftanın-günü.
# Quartz 6 alanlı: saniye dakika saat ay-günü ay hafta-günü
# Tam 00 saniyede, 30. dakikada, her saatte çalıştır
0 30 * * * ?
# Her gün gece yarısı çalıştır
0 0 0 * * ?
# Her 5 saniyede bir çalıştır
0/5 * * * * ?
# Ayın son günü sabah 10:00'da
0 0 10 L * ?
# Ayın son Cuma günü öğleden sonra 15:00'te
0 0 15 ? * 6L
Standart cron'dan temel farklar: saniye alanı (0–59) önce ve gereklidir; haftanın günü 1 (Pazar) ile 7 (Cumartesi) arasındadır, 0–6 değil; biri belirtildiğinde ayın günü veya haftanın gününde ? gereklidir; ve L, W ve # geçerli özel karakterlerdir.
Saniye alanını kaldırmadan ve haftanın günü numaralandırmasını ayarlamadan bir Quartz ifadesini bir Unix crontab'ına asla yapıştırmayın. Ayrıştırıcılar birbiriyle değiştirilemez.
Farklı Sistemlerde Cron
Linux/Unix crontab (Vixie cron)
Orijinal ve en yaygın form. Beş alan, boşlukla ayrılmış, ardından komut. CRON_TZ veya TZ gibi ortam değişkenleri saat dilimini ayarlar. Kullanıcı crontab'ları crontab -e ile düzenlenir; sistem crontab'ları /etc/cron.d/ içinde yaşar. @reboot, @daily, @hourly, @weekly ve @monthly kısayolları yaygın desenler için takma adlar olarak geniş çapta desteklenir.
GitHub Actions
GitHub Actions standart 5 alanlı cron sözdizimini kullanır, ancak saat dilimi her zaman UTC'dir — ifadenin kendisinde yerel bir saat dilimi belirtmenin bir yolu yoktur. İfadeler iş başına değil, depo düzeyinde değerlendirilir. GitHub'ın altyapısında yüksek yük dönemlerinde zamanlanmış iş akışlarının birkaç dakika gecikebileceğini unutmayın.
# GitHub Actions zamanlama sözdizimi (yalnızca 5 alanlı UTC)
on:
schedule:
# Her gün UTC 02:30'da çalıştır
- cron: '30 2 * * *'
# Her Pazartesi UTC 09:00'da çalıştır
- cron: '0 9 * * 1' Resmi GitHub Actions cron belgeleri, minimum aralığın 5 dakika olduğunu — bundan daha sık çalışacak ifadelerin sessizce yok sayıldığını belirtir.
AWS EventBridge (CloudWatch Events)
AWS EventBridge hem oran ifadelerini (rate(5 minutes)) hem de cron ifadelerini destekler. Cron varyantı 6 alanlıdır ancak Quartz'tan farklıdır: haftanın günü Sun–Sat adlarını veya 1'in Pazar olduğu 1–7'yi kullanır, tüm zamanlar UTC'dir ve ayın günü veya haftanın gününden en az birinin ? olması gerekir. AWS W veya # karakterlerini desteklemez.
# AWS EventBridge (UTC'de cron, 6 alanlı varyant)
# Her gün UTC 10:00'da çalışır
cron(0 10 * * ? *)
# Her ayın son iş günü 18:00'de çalışır
cron(0 18 L-1 * ? *) Kubernetes CronJob
Kubernetes CronJob standart 5 alanlı cron sözdizimini kullanır. Saat dilimi varsayılan olarak kube-controller-manager sürecinin saat dilimine (yönetilen kümelerde genellikle UTC) ayarlanır. Kubernetes 1.25, sistem saat dilimine güvenmeden iş başına saat dilimi yapılandırmasına izin veren CronJob spec'ine timeZone alanını ekledi.
Node.js (node-cron / cron npm)
Popüler node-cron paketi standart 5 alanlı ifadelere ek olarak başa eklenen isteğe bağlı 6. saniye alanını destekler. cron paketi Quartz uyumludur. Her ikisi de saat dilimi dizgilerini (örneğin, America/New_York) bir yapıcı seçeneği olarak destekler. Hangi formatın beklendiğini onaylamak için özel paketinizin belgelerini kontrol edin.
Yaygın Tuzaklar
Saat dilimi varsayımları
Cron, bulut ortamlarında genellikle UTC olan sunucu veya konteyner saat diliminde çalışır. "Sabah 9 iş saati"nde çalışması amaçlanan ve 0 9 * * * olarak ayarlanmış bir iş UTC 09:00'da çalışacak — bu, ofset ve DST'ye bağlı olarak yerel saat diliminizde sabah 4, 5 veya 11 olabilir. Her zaman CRON_TZ'yi ayarlayın, zamanlayıcının saat dilimi alanını kullanın veya hedef zamanınızı UTC'ye açıkça dönüştürün. Timezone Converter herhangi bir saat dilimindeki herhangi bir yerel saat için UTC eşdeğerini bulmanıza yardımcı olabilir.
Ayın günü / haftanın günü VEYA mantığı
Unix cron'da, hem ayın günü hem de haftanın günü alanları * olmadığında, servis her ikisinden biri eşleşirse işi çalıştırır. Yani 0 9 15 * 1 her ayın 15'inde VE her Pazartesi çalışır — yalnızca 15'i olan Pazartesi'lerde değil. VE mantığı elde etmek için, ek kontrolü iş betiği içinde uygulamalısınız.
Adım değerlerini aralıklarla karıştırma
*/5 "0'dan başlayarak her 5 dakikada bir" (0, 5, 10 ...) anlamına gelir. 5/5 "5'ten başlayarak her 5 dakikada bir" (5, 10, 15 ...) anlamına gelir. 5-30/5 "5. dakika ile 30. dakika arasında her 5 dakikada bir" (5, 10, 15, 20, 25, 30) anlamına gelir. Başlangıç değeri konusunda kasıtlı değilseniz, bunları aralıklarla karıştırmak beklenmedik sonuçlar üretebilir.
"Her saniye" tuzağı
Standart 5 alanlı formatta cron'un minimum çözünürlüğü bir dakikadır. Bir crontab kullanarak her saniye veya her birkaç saniyede bir çalışacak bir cron işi zamanlayamazsınız. Dakika altı zamanlama için, cron yerine bir dil düzeyinde zamanlayıcı (Node.js'te setInterval, Python'da APScheduler) veya özel olarak yapılmış bir kuyruk sistemi kullanın. Her 30 saniyede bir gerekiyorsa, iki cron işi çalıştırın: biri * * * * *'te ve diğeri yürütmeden önce 30 saniye uyuyan.
Ay numaralandırmasını kaçırma
Standart cron'da, aylar 1'den (Ocak) 12'ye (Aralık) gider. Bazı programlama dili tarih API'lerinde, aylar 0 indekslidir (0 = Ocak, 11 = Aralık). Tarih nesnelerinden programatik olarak cron ifadeleri üretiyorsanız, ay alanında bir kayma olmadığını iki kez kontrol edin.
İfadelerinizi Doğrulayın
Toova'daki Cron Parser, herhangi bir ifade için sonraki beş zamanlanmış çalıştırma süresini gösterir, hem 5 alanlı hem de 6 alanlı Quartz sözdizimini destekler ve geçersiz değerleri satır içi olarak işaretler. Hızlı bir akıl sağlığı kontrolü için, crontab.guru ifadeleri sade İngilizce ile açıklayan tanınmış etkileşimli bir araçtır. Her ikisini de yer imlerinde tutmak yararlıdır.
Zaman damgaları ve zamanlanmış zamanlarla çalışırken, Timestamp Converter Unix zaman damgaları ile herhangi bir saat dilimindeki insan tarafından okunabilir tarihler arasında çeviri yapar. Saat dilimi duyarlı zamanlamayı içeren işler için, son ifadenizi yazmadan önce ofsetleri, DST geçişlerini ve UTC eşdeğerlerini doğrulamak için bunu Timezone Converter ile eşleştirin.