Cron ifadesi örnekleri ve kuralları

Bir cron ifadesi boşlukla ayrılmış beş alandan oluşur: dakika, saat, ayın günü, ay ve haftanın günü. 0 9 * * 1-5 Pazartesiden Cumaya saat 09:00'da demektir. Bu kopya kağıdı sözdizimini, en çok kullanılan zamanlamaları ve deneyimli geliştiricileri bile şaşırtan kuralları anlatıyor. Herhangi bir ifadeyi bu sayfadaki oluşturucuya yapıştır, sade Türkçeyle oku ve sonraki çalışma zamanlarını gör.

5 dk okuma

Beş alan

Linux crontab, Kubernetes CronJob ve GitHub Actions'ın kullandığı klasik cron, soldan sağa beş alan okur. Her alan işin çalışabileceği değerleri listeler, iş de bütün alanlar o anki zamana uyduğunda çalışır. Yıldız her değer demektir.

SıraAlanİzin verilen değerlerAdlar
1Dakika0 ile 59 arası
2Saat0 ile 23 arası
3Ayın günü1 ile 31 arası
4Ay1 ile 12 arasıJAN ile DEC arası
5Haftanın günü0 ile 7 arası (0 ve 7 Pazar)SUN ile SAT arası

Burada dene: Cron İfadesi Oluşturucu

Aracın tam sayfasını aç

Özel karakterler

Dört karakter neredeyse her zamanlamayı karşılar. Tek bir alan içinde birleştirilebilirler, örneğin 1-5,10 ya da 0-30/10.

KarakterAnlamıÖrnekSonuç
*Her değerSaat alanında *Her saat
,Değer listesiDakika alanında 0,300. ve 30. dakikada
-AralıkSaat alanında 9-179 ile 17 arasında her saat
/AdımDakika alanında */1515 dakikada bir: 0, 15, 30, 45
Değerden sonra /Bir başlangıçtan adımDakika alanında 5/205., 25. ve 45. dakikada
@ kısayoluAdı olan zamanlama@daily0 0 * * * ile aynı

Sık kullanılan zamanlamalar

Bu ifadeler bu sayfadaki oluşturucuyla kontrol edildi. İhtiyacına en yakın olanı kopyala ve sayıları değiştir.

İfadeNe zaman çalışır
* * * * *Her dakika
*/5 * * * *5 dakikada bir
*/15 * * * *15 dakikada bir
0 * * * *Her saat başı
30 * * * *Her saatin 30. dakikasında
0 */6 * * *6 saatte bir: 00:00, 06:00, 12:00, 18:00
0 0 * * *Her gün gece yarısı
0 9 * * *Her gün 09:00'da
0 9,17 * * *Her gün 09:00'da ve 17:00'de
0 9 * * 1-5Pazartesiden Cumaya 09:00'da
*/10 9-17 * * 1-5Hafta içi mesai saatlerinde 10 dakikada bir
0 22 * * 0,6Cumartesi ve Pazar 22:00'de
0 9 * * 1Her Pazartesi 09:00'da
0 0 1 * *Her ayın ilk günü gece yarısı
0 0 1,15 * *Her ayın 1'inde ve 15'inde
0 0 1 */3 *Üç ayda bir, ayın ilk günü (çeyreklik)
0 0 1 1 *Yılda bir, 1 Ocak gece yarısı
15 2 * * *Her gece 02:15'te
0 12 * 6-8 *Haziran, Temmuz ve Ağustos'ta her gün öğlen
0 8 1-7 * 1Dikkat: ayın 1-7. günleri ya da her Pazartesi, aşağıya bak

Ayın günü ve haftanın günü birlikte

En çok insanı yanıltan kural budur. İki gün alanı da kısıtlandığında klasik cron ikisine birden değil, ikisinden birine uyan günlerde çalışır. Yani 0 8 1-7 * 1 ayın ilk Pazartesisi demek değildir: ayın 1 ile 7'si arasındaki günlerde ve ayrıca her Pazartesi çalışır. Aynı şekilde 0 0 13 * 5 sadece 13 Cuma günlerinde değil, her ayın 13'ünde ve her Cuma çalışır.

Bir ayrıntı daha var: iki alandan biri */2 gibi yıldızla başlıyorsa cron bu kural için onu kısıtlanmamış sayar ve iki alanın da uyması gerekir. Bu yüzden 0 0 */2 * 1 sadece ayın tek günlerine denk gelen Pazartesilerde çalışır. Bu sayfadaki oluşturucu açıklamasında iki durumu da ayrıca belirtir.

Klasik cron'da ayın ilk Pazartesisi için işi Pazartesilere kur ve ayın günü 7'den büyükse betiğin hiçbir şey yapmadan çıkmasını sağla. Quartz bunu 2#1 ile doğrudan yazabilir.

Saat dilimleri ve yaz saati

Cron, onu çalıştıran makinenin ya da servisin saat diliminde çalışır. Birçok sunucu ve bulut servisi UTC kullanır, GitHub Actions zamanlamaları her zaman UTC'dir, Kubernetes CronJob'ları da timeZone alanını ayarlamadıkça denetleyicinin saat dilimini kullanır. Bazı cron servisleri crontab içindeki CRON_TZ değişkenini de okur. Türkiye sabit UTC+3 kullandığı için UTC sunucuda 0 9 * * * ifadesi Türkiye saatiyle 12:00'de çalışır.

Yaz saati uygulanan bölgelerde yılda bir gece 02:30 hiç yaşanmaz, bir başka gece 01:30 iki kez yaşanır. Çoğu Linux cron servisi atlanan saatteki işleri geçişin hemen ardından çalıştırır, sabit saatli işleri tekrar eden saatte sadece bir kez çalıştırır, her saat çalışan işler ise ikisinde de çalışır. Başka zamanlayıcılar bu çalışmayı atlayabilir. Bir işin günde tam bir kez çalışması gerekiyorsa onu 01:00 ile 03:00 dışına kur ya da zamanlayıcıyı UTC'de çalıştır. Oluşturucudaki çalışma listesi saat değişimine denk gelen her çalışmayı işaretler.

Saniyeler, Quartz ve Spring

Java ve bazı JavaScript zamanlayıcıları başa bir saniye alanı ekler, bu yüzden ifadeleri altı alanlıdır: 0 */5 * * * * beş dakikada bir, 0. saniyede çalışır. Quartz daha ileri gider ve birkaç kuralı değiştirir; klasik bir ifadenin orada çoğu zaman hata vermesinin nedeni budur.

  • Quartz'da 6 ya da 7 alan vardır: saniye, dakika, saat, ayın günü, ay, haftanın günü ve isteğe bağlı yıl.
  • Haftanın günleri Pazardan başlayarak 1 ile 7 arasında numaralanır, yani MON 2'dir. MON-FRI gibi adlar bu karışıklığı önler.
  • İki gün alanından biri ? olmalıdır, bu belirli bir değer yok demektir. 0 0 9 ? * MON-FRI hafta içi 09:00'da çalışır.
  • L son demektir: ayın günü alanında L ayın son günüdür, haftanın günü alanında 6L ayın son Cumasıdır.
  • W en yakın iş gününü seçer: 15W ayın 15'ine en yakın iş gününde, LW ayın son iş gününde çalışır.
  • # ayın n'inci haftanın gününü seçer: 6#3 ayın üçüncü Cumasıdır.
  • Spring'in @Scheduled'ı da saniyesi başta olan altı alan kullanır, ama haftanın günlerini klasik cron gibi 0 ile 7 arasında numaralar ve ? istemez.

Kaçınılması gereken hatalar

Aşağıdaki hatalar cron işlerinin sessizce yanlış zamanda çalışmasının en yaygın nedenleri. İfadeyi kaydetmeden önce oluşturucuda sonraki çalışmalara bakmak çoğunu yakalar.

  • Günde bir kez demek isterken * * * * * yazmak. İlk alan dakikadır, bu ifade günde 1.440 kez çalışır.
  • Ayın günü alanındaki */7 ifadesinin yedi günde bir anlamına geldiğini sanmak. Bu 1, 8, 15, 22 ve 29. günler demektir ve ayın 1'inde yeniden başlar.
  • 31, 30 ya da 29. günü kullanmak. Bu günü olmayan aylar son güne kaydırılmaz, atlanır.
  • Saat dilimini unutmak. UTC sunucudaki 0 9 * * * UTC ile 09:00'da çalışır, bu kullanıcılarının bulunduğu yerde gece olabilir.
  • Linux crontab'da L ya da ? gibi Quartz özelliklerini, Quartz'da ise beş alanlı bir ifade kullanmak. Oluşturucu sözdizimini değiştirdiğinde ifadeyi çevirir.

Adım adım

  1. Sözdizimini seçCrontab, Kubernetes ve GitHub Actions için Standart (5 alan), saniye ekleyen zamanlayıcılar için Saniyeli (6 alan) ya da Quartz'ı seç.
  2. Bir zamanlamadan başlaSık kullanılan zamanlamalardan birine tıkla ya da kendi ifadeni Cron ifadesi kutusuna yapıştır.
  3. Alanları ayarlaFormda her alanı Her, Her n, Belirli ya da Aralık olarak ayarla.
  4. Açıklamayı okuİfadenin altındaki cümleyi ve notları kontrol et. Gün alanı kuralı geçerliyse notlar seni uyarır.
  5. Sonraki çalışmalara bakSunucunun saat dilimini seç ve ifadeyi kopyalamadan önce sonraki 10 çalışmaya göz at.

Sık sorulan sorular

Bir cron işini 5 dakikada bir nasıl çalıştırırım?

*/5 * * * * kullan. Her saatin 0, 5, 10 ve devamındaki dakikalarında çalışır.

Bir işi hafta içi her sabah 9'da nasıl çalıştırırım?

0 9 * * 1-5 kullan. Quartz'da aynı zamanlama 0 0 9 ? * MON-FRI olarak yazılır.

Cron bir işi 30 saniyede bir çalıştırabilir mi?

Klasik cron bir dakikanın altına inemez. Saniye alanı olan zamanlayıcılar inebilir, örneğin */30 * * * * *. Crontab'da yaygın çözüm, biri sleep 30 ile başlayan iki satır eklemektir.

Haftanın günü alanında 0 ile 7 arasındaki fark ne?

Klasik cron'da fark yok: ikisi de Pazar demektir. Quartz'da 1 Pazar, 7 Cumartesidir.

İşim neden beklemediğim bir günde çalıştı?

Çoğu zaman iki gün alanı da ayarlı olduğu ve cron ikisinden birine uyan günlerde çalıştığı için ya da sunucu başka bir saat dilimi kullandığı için. İkisini de görmek için ifadeyi oluşturucuya yapıştır.

Test ederken ifadem bir yere gönderiliyor mu?

Hayır. Açıklama ve çalışma zamanları tarayıcında hesaplanır.