Skip to main content

Cron İfadesi Oluşturucu

Cron ifadesi kurun ve okuyun. Her alan sade bir dille açıklanır, sonraki beş çalışma zamanı listelenir; böylece zamanlamayı yayına almadan doğrularsınız.

Veriler tarayıcınızdan çıkmazGüncelleme: Temmuz 2026
Hazır örnekler

Bu ifade ne zaman çalışır

Her hafta Pazartesi günleri saat 09:00 itibarıyla çalışır.

Sonraki 5 çalışma

  1. 27 Temmuz 2026 Pazartesi 09:00
  2. 3 Ağustos 2026 Pazartesi 09:00
  3. 10 Ağustos 2026 Pazartesi 09:00
  4. 17 Ağustos 2026 Pazartesi 09:00
  5. 24 Ağustos 2026 Pazartesi 09:00

Zamanlar tarayıcınızın yerel saat dilimine göre gösterilir.

Özet (TL;DR)

  • Standart cron beş alandır ve saniye alanı yoktur. Altı alanlı bir ifade Quartz veya Spring lehçesidir, crontab onu reddeder.
  • Ayın günü ve haftanın günü alanlarının ikisi de kısıtlıysa iş, HERHANGİ BİRİ tuttuğunda çalışır: 0 0 13 * 5 ayın 13'ü VE her cuma demektir, 13'üne denk gelen cuma değil.
  • */7 dakika alanında 0, 7, 14 ... 56 üretir, sonra saat başında 0'a döner; yani iki tetikleme arasındaki son aralık 7 dakika değil 4 dakikadır.
  • Cron sunucunun yerel saatini kullanır. Yaz saati geçişinde 02:30'a kurulmuş bir iş yılda bir kez hiç çalışmaz, bir kez de iki kez çalışır.

Gece çalışacak iş her dakika çalıştı

Yedeklemenin her gece üçte alınması gerekiyordu. Sabah loglara bakınca iş 1440 kez çalışmış oluyor. Sebep neredeyse her zaman alan sırasının karışması: 3 * * * * yazılmış, 0 3 * * * yazılması gerekirken. İlki "her saatin 3. dakikasında", ikincisi "her gün saat 03:00'te". Sözdizimi geçerli olduğu için crontab hiçbir uyarı vermiyor ve hata ancak fatura ya da disk dolduğunda ortaya çıkıyor.

Alan sırası ve saniye meselesi

Beş alan var ve sırası soldan sağa şu: dakika, saat, ayın günü, ay, haftanın günü.

AlanAralıkKabul edilen isimler
Dakika0-59yok
Saat0-23yok
Ayın günü1-31yok
Ay1-12JAN ... DEC
Haftanın günü0-7SUN ... SAT (0 ve 7 pazar)
Haftanın gününde 7, pazar için 0'ın takma adıdır; araç ikisini de kabul eder.

Saniye alanı yok. Bunu arayan çoğu kişi altı alanlı bir ifadeyle karşılaştığı için arıyor, ama o ifade Quartz veya Spring Scheduler lehçesine ait. Bir sunucudaki crontab altı alanlı satırı kabul etmez, altıncı alanı komut sanıp anlamsız bir şey çalıştırmaya çalışır. Araç da bilinçli olarak yalnızca beş alanı kabul ediyor: hangi lehçeyi kastettiğinizi tahmin etmek, sunucudakinden farklı çalışan bir zamanlama üretmek demek. @daily gibi makrolar da aynı sebeple reddediliyor.

Adım sözdizimi ve sarmama sorunu

*/15 yazdığınızda alan 0'dan başlayıp maksimuma kadar 15'er artıyor: 0, 15, 30, 45. Dakika alanı 60 değerli olduğu ve 15, 60'ı tam böldüğü için bu düzgün çalışıyor. Bölmeyen bir adım seçtiğinizde ise aralık saat başında bozuluyor, çünkü adım bir sonraki saate sarmıyor.

bash
# */7 dakika alaninda uretilen degerler0, 7, 14, 21, 28, 35, 42, 49, 56 # 56'dan sonra bir sonraki tetikleme 00:00 değil, sonraki saatin 0. dakikası# yani son aralık 7 dakika değil 4 dakika # Aynı sorun saat alanında: */5 için0, 5, 10, 15, 20   # 20'den sonra ertesi gun 0, arada 4 saat var

"Her 7 dakikada bir" gerçekten gerekiyorsa cron bunu ifade edemiyor; ya bölen bir değere yuvarlayın (5, 10, 15, 20, 30) ya da zamanlamayı uygulamanın içine alın. Bu araçtaki sonraki çalışma listesi, aralıkların nerede daraldığını doğrudan gösteriyor.

İki gün alanı arasındaki OR kuralı

Cron'un en şaşırtıcı davranışı bu. Diğer bütün alanlar birbiriyle VE ilişkisinde: dakika tutacak, saat tutacak, ay tutacak. Ama ayın günü ile haftanın günü alanlarının ikisi birden kısıtlıysa (yani ikisi de * değilse) kural VEYA'ya dönüyor. İkisinden biri tutuyorsa iş çalışıyor.

bash
0 0 13 * 5# Beklenen: 13'üne denk gelen cuma (yılda bir iki kez)# Gerçek:   ayın her 13'ü, VE ayrıca her cuma (yılda ~64 kez) 0 0 1 * MON# Ayın 1'i, ve ayrıca her pazartesi 0 0 13 * *# Yalnızca ayın 13'ü (haftanın günü * olduğu için OR devrede değil)

Uyarı

Cron ile "ayın 13'üne denk gelen cuma" ifadesini yazmanın bir yolu yok. Pratikte yapılan şey, işi her cuma çalıştırıp (0 0 * * 5) tarihin 13 olup olmadığını script'in ilk satırında kontrol etmek: [ "$(date +\%d)" = "13" ] || exit 0. Crontab içinde yüzde işaretinin ters eğik çizgiyle kaçırılması gerektiğini unutmayın, aksi halde cron onu yeni satır olarak yorumlar.

Zaman dilimi ve yaz saati

Cron sunucunun yerel saat dilimine göre çalışıyor. Sunucu UTC ise 0 9 * * * ifadesi Türkiye saatiyle 12:00'de tetikleniyor. Kendi makinenizde denediğiniz ifadenin sunucuda farklı davranmasının en yaygın sebebi bu. Sistem genelinde TZ değişkenini değiştirmek yerine crontab dosyasının başına CRON_TZ=Europe/Istanbul satırı eklemek daha güvenli, çünkü diğer servisleri etkilemiyor.

Yaz saati uygulanan bölgelerde ise geçiş saatleri sorun çıkarıyor. Saatlerin ileri alındığı gece 02:30 hiç yaşanmıyor, dolayısıyla o saate kurulmuş iş atlanıyor. Geri alındığı gece ise 02:30 iki kez yaşanıyor ve iş iki kez çalışıyor. İşiniz idempotent değilse (fatura kesiyorsa, e-posta gönderiyorsa) 00:30 ile 01:00 arası veya 04:00 sonrası gibi geçiş penceresinin dışına alın. Türkiye 2016'dan beri kalıcı olarak UTC+3 kullandığı için bu sorun yerel sunucularda görülmüyor, ama Avrupa'daki bir bölgede duran sunucuda görülüyor.

Sıkça Sorulan Sorular

5 dakikada bir nasıl çalıştırırım?
*/5 * * * * yazın. Bu her saatin 0, 5, 10 ... 55. dakikalarında çalışır ve 5 sayısı 60'ı tam böldüğü için aralıklar eşit kalır. Belirli dakikalar istiyorsanız virgülle de yazabilirsiniz: 0,5,10,15,20,25,30,35,40,45,50,55 * * * * aynı sonucu verir ama okunması zordur.
Yıldız işareti ne anlama geliyor?
Yıldız o alandaki her değer demek. Dakika alanında * her dakika, ay alanında * her ay anlamına gelir. Beş alanın hepsi yıldız olduğunda (* * * * *) iş dakikada bir çalışır. Yıldızın ikinci bir işlevi daha var: iki gün alanından biri yıldızsa OR kuralı devreye girmez, bu yüzden 0 0 13 * * yalnızca ayın 13'ünde çalışır.
13'üne denk gelen cuma için ne yazmalıyım?
Cron bunu ifade edemez. 0 0 13 * 5 yazarsanız ayın her 13'ü ve ayrıca her cuma çalışır, yılda yaklaşık 64 kez. Doğru yaklaşım işi 0 0 13 * * ile ayın 13'üne kurmak ve script içinde günün cuma olup olmadığını kontrol etmek, ya da tam tersi. İki koşulun kesişimini cron değil, çalıştırdığınız komut belirlemeli.
Cron UTC mi kullanıyor?
Sunucunun sistem saat dilimini kullanır. Bulut sağlayıcılarının çoğunda varsayılan UTC olduğu için pratikte çoğu zaman UTC olur, ama bu bir kural değil. date komutuyla sunucunun ne kullandığını doğrulayın. Belirli bir dilim istiyorsanız crontab dosyasının en üstüne CRON_TZ=Europe/Istanbul ekleyin; bu yalnızca o dosyadaki işleri etkiler.
İşim neden iki kez çalıştı?
Üç olası sebep var. Birincisi yaz saati: geri alınan gecede 02:00 ile 03:00 arasındaki saat iki kez yaşanır. İkincisi aynı ifadenin hem sistem crontab'ında hem kullanıcı crontab'ında bulunması, crontab -l ile /etc/cron.d/ içeriğini ayrı ayrı kontrol edin. Üçüncüsü ve en sinsisi, önceki çalışmanın bitmemiş olması: cron bir öncekinin bittiğini beklemez, bu yüzden uzun süren işlerde bir kilit dosyası veya flock kullanmanız gerekir.

Mustafa Kürşad BAŞER

Yazılım Mühendisi

Karmaşık sorunları zarif çözümlerle buluşturan, öğrendiklerini paylaşarak değer katmayı seven bir yazılım mühendisi.

Hızlı Erişim

Bağlantı

© 2026 Mustafa Kürşad BAŞER. Tüm hakları saklıdır.