Bu Araç Nedir?
Bir cron ifadesi, Unix `cron` daemonu ve ona göre modellenmiş hemen hemen her iş zamanlayıcısı (crontab, Kubernetes CronJob'ları, GitHub Actions `schedule:`, Airflow, Jenkins) tarafından kullanılan kompakt, beş alanlı bir zamanlama dizesidir — `dakika saat ayın-günü ay haftanın-günü`. Her alan bir yıldız işareti (`*`, "herhangi bir değer" anlamına gelir), belirli bir sayı, virgülle ayrılmış bir liste (`1,15,30`), bir aralık (`9-17`), bir adım (`*/15`, "her 15 birimde bir" anlamına gelir) veya — ay ve haftanın günü için — bir sayı yerine üç harfli bir ad (`JAN`, `MON`) kabul eder.
Bu sözdiziminin kanonik tanımı, aynı beş alanı, özel karakterleri (`* , - /`) ve çoğu cron uygulamasının, Vixie cron dahil (çoğu Linux dağıtımında bulunan sürüm), yaygın zamanlamalar için takma ad olarak desteklediği sekiz `@` kısaltma dizesini (`@reboot`, `@yearly`/`@annually`, `@monthly`, `@weekly`, `@daily`/`@midnight`, `@hourly`) belgeleyen Linux crontab(5) man sayfasıdır.
Bu araç, tam olarak o standart 5 alanlı formatı uygular — bir Linux veya macOS sunucusunda doğrudan `crontab -e` içine, veya bir Kubernetes CronJob'unun `schedule:` alanına koyacağınız formattır. Java'nın Quartz Scheduler'ı ve bazı satıcı araçları tarafından kullanılan farklı, 6 veya 7 alanlı bir format olan Quartz cron sözdizimini uygulamaz (buna ne zaman ihtiyacınız olduğunu görmek için aşağıdaki karşılaştırma bölümüne bakın).
Neden Kullanmalısınız?
- Az önce `17 3 * * 0` gibi bir satır içeren, hiçbir açıklama yorumu olmayan bir üretim crontab'ı devraldınız — herhangi bir şeye dokunmadan önce buraya yapıştırın ve bunun aslında bir yazım hatası değil "her pazar sabah 3:17" anlamına geldiğini görün.
- `schedule:` cron tetikleyicili bir GitHub Actions workflow'u yazıyorsunuz ve `0 */6 * * *`'ın gerçekten gece yarısından başlayarak her 6 saatte bir anlamına gelip gelmediğinden emin olamıyorsunuz — YAML'ı commit'lemeden önce bir sonraki 5 çalışma zamanını kontrol edin.
- Hem ayın günü hem haftanın günü kısıtlamasına sahip bir cron işi kurdunuz, örneğin `0 4 8 * MON`, ve iş beklemediğiniz günlerde tetikleniyor — bu araç neredeyse herkesi ilk seferinde şaşırtan VE değil VEYA birleşim davranışını gözler önüne serer.
- Bir Kubernetes CronJob'u kuruyorsunuz ve "her 15 dakikada bir, sadece mesai saatlerinde, hafta içi" için tam `schedule:` dizesine, alanları elle saymadan ihtiyacınız var — elle yazmak yerine açılır menü oluşturucusunu kullanın.
- Bir zamanlayıcı yapılandırmasının standart cron mu yoksa Quartz cron mu kullandığından emin değilsiniz çünkü belgeler sadece "cron ifadesi" diyor — format uyuşmazlığını debug etmeye zaman harcamadan önce 5 alanı mı (bu araç) yoksa `?`/`L`/`W`/`#` karakterli 6-7 alanı mı (Quartz) olduğunu kontrol edin.
- %100 istemci tarafında: zamanlama mantığınız tarayıcınızdan asla çıkmaz.
Nasıl Kullanılır
- Bir ifadeyi çevirmek için: giriş alanına 5 alanlı bir cron dizesi (veya `@daily` gibi bir @kısaltması) yazın veya yapıştırın.
- Altındaki sade dille açıklamayı ve hesaplanan bir sonraki 5 çalışma zamanını okuyun — ikisi de siz yazdıkça canlı olarak güncellenir.
- Bunun yerine bir tane oluşturmak için: Oluşturucu bölümünü açın, beş alanın her biri için bir mod (her / her N / belirli değer) seçin ve "İfade oluştur"a tıklayın.
- Oluşturulan ifade yukarıdaki giriş alanını doldurur ve hemen açıklama ile bir sonraki çalışma zamanları panellerine yansır.
- Alttaki sözdizimi lejantını `*`, `,`, `-` ve `/` için hızlı bir referans olarak kullanın.
- Kopyala düğmesiyle son ifadeyi kopyalayın ve crontab'ınıza, CI yapılandırmanıza veya zamanlayıcınıza yapıştırın.
Örnek
Giriş
*/15 9-17 * * MON-FRIÇıkış
09:00, 09:15, 09:30, 09:45, 10:00 ... 17:45'te, Pazartesi, Salı, Çarşamba, Perşembe, Cuma günleriBu ifade her 15 dakikada bir çalışır, ancak yalnızca 09:00–17:59 saat aralığında ve yalnızca hafta içi — tipik bir "mesai saatleri" sorgulama zamanlaması.
Standart cron ve Quartz cron
"Cron sözdizimi" tek bir evrensel standart değildir — en sık karşılaşacağınız iki format, alan sayısı ve bazı özel karakterlerin anlamı bakımından farklılık gösterir. Hedef zamanlayıcınız için doğru olanı kullandığınızı doğrulamak üzere bu tabloyu kullanın.
| Özellik | Standart cron (bu araç) | Quartz cron |
|---|---|---|
| Alan sayısı | 5 (minute hour dom month dow) | 6 veya 7 (saniye ve isteğe bağlı yıl ekler) |
| Kullanan sistemler | Linux/macOS crontab, Kubernetes CronJob, GitHub Actions | Java Quartz Scheduler, bazı kurumsal zamanlayıcılar |
| Ayın günü + haftanın günü ikisi de ayarlı | HERHANGİ biriyle eşleşir (birleşim/VEYA) | İki alandan birinde `?` gerektirir — ikisine aynı anda bir değer atanamaz |
| Ek özel karakterler | `* , - /` dışında yok | `?`, `L` (son), `W` (en yakın hafta içi günü), `#` (ayın n'inci haftanın günü) ekler |
| Saniye düzeyinde zamanlama | Desteklenmiyor | Destekleniyor (ilk alan) |
İlgili araçlar
Yapılandırmalar, zamanlamalar veya zaman damgalarıyla mı çalışıyorsunuz? Bu araçlar cron oluşturucuyla iyi eşleşir.
→ Zaman Damgası Dönüştürücü · Dünya Saati Dönüştürücü · Tarih Hesaplayıcı
Yaygın zamanlama tarifleri
Bir avuç ifade, gerçek dünyadaki zamanlama ihtiyaçlarının çoğunu kapsar — her seferinde yeniden türetmek yerine bunları görür görmez tanımaya değer.
- `*/5 * * * *` — tüm gün boyunca her 5 dakikada bir. Sağlık kontrolleri ve hafif sorgulama işleri için yaygın.
- `0 */6 * * *` — her 6 saatte bir, tam saatte (00:00, 06:00, 12:00, 18:00). Periyodik senkronizasyon veya temizlik görevleri için sık kullanılan bir varsayılan.
- `0 2 * * *` — günde bir kez, gece 2'de. Trafiğin en düşük olduğu, gece yedeklemeleri için klasik zaman dilimi.
- `0 9 * * 1-5` — sabah 9'da, sadece pazartesiden cumaya. Sadece mesai saatlerinde çalışan raporlar veya özetler için standart.
- `0 0 1 * *` — her ayın 1'i gece yarısı, `@monthly` kısaltmasına eşdeğer. Aylık faturalama çalıştırmaları veya kullanım sıfırlamaları için kullanılır.
- `*/15 9-17 * * MON-FRI` — her 15 dakikada bir, ama sadece hafta içi mesai saatlerinde — tek bir ifadede bir adım, bir aralık ve bir haftanın günü aralığını birleştirir.
Sıkça Sorulan Sorular
Cron ifadesi nedir?
Bir cron ifadesi, Unix `cron` daemonu ve uyumlu zamanlayıcılar için tekrarlayan bir zamanlama belirten 5 alanlı bir metin dizesidir (`dakika saat ayın-günü ay haftanın-günü`). Her alan `*` (herhangi bir değer), bir sayı, virgülle ayrılmış bir liste, bir aralık (`a-b`) veya bir adım (`*/n`) olabilir; ay ve haftanın günü alanları `JAN` veya `MON` gibi üç harfli adları da kabul eder. Tam özellik crontab(5) man sayfasında belgelenmiştir.
Hem ayın günü hem de haftanın günü kısıtlandığında ne olur?
Bu, iyi bilinen bir cron tuzağıdır: POSIX cron semantiğine göre, hem ayın günü hem de haftanın günü alanları kısıtlandığında (yani `*` olmadığında), koşullardan HERHANGİ biri sağlandığında bir iş çalışır — bu bir birleşimdir (VEYA), kesişim (VE) değildir. Örneğin, `0 4 8 * MON` hem her ayın 8'inde hem de her Pazartesi sabah 4'te çalışır, yalnızca ayın 8'ine denk gelen Pazartesilerde değil. Bu araç, bir sonraki çalışma zamanlarını hesaplarken tam olarak bu birleşim davranışını uygular.
Standart cron mu Quartz cron mu — hangisine ihtiyacınız var?
Bu araç, Linux/macOS `crontab`, Kubernetes CronJob'ları, GitHub Actions `schedule:` ve çoğu Unix türevi iş çalıştırıcısı tarafından kullanılan formatı, standart 5 alanlı POSIX/Vixie cron sözdizimini oluşturur. Java'nın Quartz Scheduler'ı ve onun üzerine inşa edilmiş araçlar (bazı kurumsal zamanlayıcılar, eski Spring Batch yapılandırmaları) tarafından kullanılan Quartz cron, baştan bir saniye alanı ekleyen ve bazı özel karakterlerin anlamını değiştiren farklı, 6 veya 7 alanlı bir formattır (gün alanlarında "belirli bir değer yok" için `?`, "son gün," "en yakın hafta içi günü" ve "ayın n'inci haftanın günü" için `L`/`W`/`#`). Zamanlayıcınızın alan sayısı 6 veya 7 ise, veya belgeleriniz `?`, `L`, `W` ya da `#`'den bahsediyorsa, Quartz'a özel bir araca ihtiyacınız var — bu oluşturucudan gelen ifadeler orada doğru ayrıştırılmaz. Tam olarak 5 alan ise (veya `@daily` tarzı bir kısaltmaysa), doğru yerdesiniz.
@yearly, @monthly, @weekly, @daily ve @hourly kısayolları ne anlama gelir?
Bunlar, yaygın 5 alanlı ifadelere genişleyen, standart olmayan ancak yaygın olarak desteklenen kısaltma dizeleridir: `@yearly`/`@annually` = `0 0 1 1 *` (yılda bir kez, 1 Ocak gece yarısı), `@monthly` = `0 0 1 * *` (her ayın 1'i gece yarısı), `@weekly` = `0 0 * * 0` (her Pazar gece yarısı), `@daily`/`@midnight` = `0 0 * * *` (her gün gece yarısı), `@hourly` = `0 * * * *` (her saatin başında). Bu araç bunların hepsini ayrıştırır ve tam olarak genişletilmiş 5 alanlı karşılıkları gibi ele alır.
Sayılar yerine gün/ay adları kullanabilir miyim?
Evet. Ay alanı `JAN`'dan `DEC`'e kadar üç harfli adları kabul eder ve haftanın günü alanı `SUN`'dan `SAT`'a kadar (büyük/küçük harf duyarsız), sayılarla değiştirilebilir şekilde kabul eder. Haftanın günü sayıları 0-6 arasında değişir, 0 = Pazar; bazı uygulamalar Pazar için 7'yi de kabul eder, bu araç bunu 0'a normalleştirir. Aralıklar ve listeler adlarla da çalışır, örneğin `MON-FRI` veya `JAN,JUN,DEC`.
Cron ifadem bir sunucuya gönderiliyor mu?
Hayır. Ayrıştırma, sade dille açıklama ve bir sonraki çalışma zamanı hesaplaması tamamen tarayıcınızda yerel olarak JavaScript ile gerçekleşir. Yazdığınız veya oluşturduğunuz hiçbir şey cihazınızdan çıkmaz.
Bir sonraki çalışma zamanları hangi saat diliminde hesaplanır?
Standart cron'un kendi başına yerleşik bir saat dilimi alanı olmadığı için bu araç, bir sonraki çalışma zamanlarını tarayıcınızın yerel saat dilimini kullanarak hesaplar — işinizi gerçekten çalıştıran daemon veya zamanlayıcı, ana bilgisayar sisteminde ayarlı olan saat dilimini (veya GitHub Actions gibi bulut zamanlayıcıları için UTC'yi) kullanır. Sunucunuzun saat dilimi tarayıcınızınkinden farklıysa, gösterilen zamanları zihinsel olarak kaydırın veya zamanlayıcınızın saat dilimi yapılandırmasını ayrıca kontrol edin.
Bir işi sadece ayın son gününde çalışacak şekilde nasıl zamanlarım?
Standart 5 alanlı cron'da doğrudan "ayın son günü" sözdizimi yoktur — bu, Quartz cron'un `L` karakteriyle eklediği özelliklerden biridir. Standart cron'da yaygın çözüm, işi her ayın 28-31'i için zamanlamak (`0 0 28-31 * *`) ve betiğin kendisinin, gerçek mantığını çalıştırmadan önce yarının tarihinin yeni bir aya geçip geçmediğini kontrol etmesini sağlamaktır.
Bir şeyi her 10 dakikada bir gibi alışılmadık bir aralıkta çalışacak şekilde zamanlayabilir miyim?
Evet, adım sözdizimini kullanarak: `*/10 * * * *`, :00'dan başlayarak her 10 dakikada bir çalışır (yani :00, :10, :20, :30, :40, :50'de). Adımların her zaman alanın minimum değerinden saymaya başladığını unutmayın, bu yüzden dakika alanındaki `*/10` asla :05 veya :15'e denk gelmez — böyle bir kayma gerekiyorsa, bunun yerine açık bir virgülle ayrılmış liste kullanın, örneğin `5,15,25,35,45,55`.
Yaz saati değişimi civarında cron işim neden aynı anda iki kez çalışıyor gibi görünüyor veya hiç çalışmıyor?
Standart cron, ana bilgisayar sistemindeki duvar saatine göre zamanlama yapar ve yaz saati geçişleri ya atlanan bir saat (bahar ileri) ya da tekrarlanan bir saat (sonbahar geri) yaratır. Atlanan veya tekrarlanan saatte zamanlanmış bir iş, cron daemon'unuzun bu durumu nasıl ele aldığına bağlı olarak o gün sıfır veya iki kez çalışabilir. Kritik altyapı işlerini yaz saati uygulamayan UTC'ye ayarlı sunucularda çalıştırmak bunu tamamen önler.