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.
Bu ifade ne zaman çalışır
Her hafta Pazartesi günleri saat 09:00 itibarıyla çalışır.
Sonraki 5 çalışma
- 27 Temmuz 2026 Pazartesi 09:00
- 3 Ağustos 2026 Pazartesi 09:00
- 10 Ağustos 2026 Pazartesi 09:00
- 17 Ağustos 2026 Pazartesi 09:00
- 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,
crontabonu 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 * 5ayın 13'ü VE her cuma demektir, 13'üne denk gelen cuma değil. */7dakika 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ü.
| Alan | Aralık | Kabul edilen isimler |
|---|---|---|
| Dakika | 0-59 | yok |
| Saat | 0-23 | yok |
| Ayın günü | 1-31 | yok |
| Ay | 1-12 | JAN ... DEC |
| Haftanın günü | 0-7 | SUN ... SAT (0 ve 7 pazar) |
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.
# */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.
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ı
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üzden0 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 * 5yazarsanız ayın her 13'ü ve ayrıca her cuma çalışır, yılda yaklaşık 64 kez. Doğru yaklaşım işi0 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.
datekomutuyla sunucunun ne kullandığını doğrulayın. Belirli bir dilim istiyorsanız crontab dosyasının en üstüneCRON_TZ=Europe/Istanbulekleyin; 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 -lile/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ı veyaflockkullanmanız gerekir.