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ıra | Alan | İzin verilen değerler | Adlar |
|---|---|---|---|
| 1 | Dakika | 0 ile 59 arası | |
| 2 | Saat | 0 ile 23 arası | |
| 3 | Ayın günü | 1 ile 31 arası | |
| 4 | Ay | 1 ile 12 arası | JAN ile DEC arası |
| 5 | Haftanı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.
| Karakter | Anlamı | Örnek | Sonuç |
|---|---|---|---|
| * | Her değer | Saat alanında * | Her saat |
| , | Değer listesi | Dakika alanında 0,30 | 0. ve 30. dakikada |
| - | Aralık | Saat alanında 9-17 | 9 ile 17 arasında her saat |
| / | Adım | Dakika alanında */15 | 15 dakikada bir: 0, 15, 30, 45 |
| Değerden sonra / | Bir başlangıçtan adım | Dakika alanında 5/20 | 5., 25. ve 45. dakikada |
| @ kısayolu | Adı olan zamanlama | @daily | 0 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.
| İfade | Ne 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-5 | Pazartesiden Cumaya 09:00'da |
| */10 9-17 * * 1-5 | Hafta içi mesai saatlerinde 10 dakikada bir |
| 0 22 * * 0,6 | Cumartesi ve Pazar 22:00'de |
| 0 9 * * 1 | Her 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 * 1 | Dikkat: 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.