Cron ifadesi açıklayıcı
Herhangi bir cron ifadesini — Vixie, Quartz, EventBridge, Jenkins — açıklar, sonraki çalışmalarını istediğiniz saat diliminde listeler ve tuzakları işaretler.
Vixie cron olarak okundu.
Ne anlama geliyor
Saat 00:00 ayın 13. gününde veya Cuma günleri
Alan alan
| Alan | Yazılan | Eşleşenler |
|---|---|---|
| Dakika | 0 | 0 |
| Saat | 0 | 0 |
| Ayın günü | 13 | 13 |
| Ay | * | her değer |
| Haftanın günü | 5 | Cuma |
Nelere dikkat etmeli
- Her iki gün alanı da kısıtlanmış; bu yüzden cron bunu ikisi birden değil, biri eşleştiğinde çalıştırır — ayın günü ya da haftanın günü. 13 ile Cuma'nın 13. Cuma değil, ayın 13'ü ve her Cuma anlamına gelmesinin nedeni budur.
Sonraki çalışmalar
Bu araç ne yapar
Bir cron ifadesini size kelimelerle geri okur, işin çalıştığı hangi saat diliminde olursa olsun gerçekten tetikleneceği sonraki zamanları listeler ve ifadenin ima ettiği ama söylemediği şeyleri adlandırır. O son kısım asıl noktadır: bir cron ifadesi asla bir hata üretecek şekilde yanlış değildir. Birileri fark edene dek sessizce yanlış günlerde çalışır.
Bir değil, dört lehçe anlaşılır. crontab'ın aldığı beş alanlı biçim, saniye alanı ve takvim kurallarıyla Quartz, sonda bir yılla AWS EventBridge ve hash'iyle Jenkins. Birini yalnızca başka birini bilen bir araca yapıştırmak, çoğu kişinin birden fazla olduğunu ilk keşfetme biçimidir.
Alanlar ve kaç tane oldukları
Klasik ifadenin, boşluklarla ayrılmış, sabit bir sırada beş alanı vardır: dakika, saat, ayın günü, ay, haftanın günü. Her biri ya «her» anlamına gelen bir yıldız, bir sayı, virgüllerle ayrılmış bir liste, bir tireyle bir aralık ya da bir eğik çizgiyle bir adımdır. Aylar ve günler üç harfli adlar olarak yazılabilir, ki bu neredeyse her zaman basamaklardan daha nettir.
- Bir yıldız, alanın alabileceği her değer anlamına gelir.
- 9-17 gibi bir aralık, 9'dan 17'ye kadar (dahil) her değer anlamına gelir.
- */15 gibi bir adım, alanın en altından başlayarak her 15. değer anlamına gelir; 9-17/2 bir aralık içinde adımlar ve 5/15, 5'ten en üste adımlar.
- 0,30 gibi bir liste, tam olarak o değerler anlamına gelir.
- 13-13 gibi dejenere bir aralık yalnızca 13'tür — bazı kütüphaneler bunu yanlış yapar ve onu bir yıldız olarak ele alır.
Altıncı bir alan, lehçelerin ayrıldığı yerdir. Quartz onu öne koyar ve saniye olarak okur; EventBridge onu sona koyar ve yıl olarak okur. Bu yüzden altı çıplak alan gerçekten belirsizdir ve bu araç, sessizce seçmek yerine onları hangi yönde okuduğunu söyler. İfadeyi cron(...) içine sarmak — EventBridge'in kendi söz dizimi — bunu çözer.
Makrolar kısaltmalardır: @hourly, @daily, @midnight, @weekly, @monthly, @yearly ve @annually. Araç, bunların sıradan ifadelere açıldığını gösterir. @reboot istisnadır ve hiç bir çizelge değildir.
İki gün alanı ve «ve» gibi görünen «veya»
Bir tarih iki farklı şekilde seçilebilir — ayın gününe göre ve haftanın gününe göre — ve cron'un her iki alanı da vardır. İkisi de kısıtlandığında, iş biri eşleştiğinde çalışır. İkisi birden değil.
Yani 0 0 13 * 5, 13. Cuma değildir. Her ayın 13'ü ve her Cuma'dır: bir ya da iki gün yerine yılda yaklaşık 64 gün. İfade bir birleşim (ve) gibi görünür ve bir ayrışım (veya) gibi davranır, hiçbir şey bir hata bildirmez ve iş yalnızca amaçlanandan daha sık çalışır.
Kuralın daha da tuhaf bir ikinci yarısı vardır ve neredeyse hiç kimsenin bilmediği odur. Cron, bir gün alanının kısıtlanıp kısıtlanmadığını sınamaz; alanın ilk karakterinin bir yıldız olup olmadığını sınar. Yani */14 gibi bir adım, alanı 1'e, 15'e ve 29'a kısıtlasa bile bir yıldız sayılır — ve varlığı iki gün alanını «veya»dan geri «ve»ye çevirir. Eşit derecede kısıtlanmış görünen iki ifade o zaman tümüyle farklı davranır ve bu araç hangi kuralın yürürlükte olduğunu bildirir.
Quartz ve EventBridge, her iki alanın da bir şey söylemesine izin vermeyi reddederek tüm soruyu önler: tam olarak birinin bir soru işareti olması gerekir, ki bu «belirli bir değer yok, diğer alan karar verir» anlamına gelir.
Alanını bölmeyen adımlar
Bir adım, bir aralıkmış gibi yazılır ve alanın bir döngüsü içinde öyledir. Sınır boyunca genellikle değildir.
Saat alanında */7, 0, 7, 14 ve 21 saatleri anlamına gelir. 21'den sonra alan tükenir, dolayısıyla sonraki çalışma ertesi gün 0'dadır — yedi değil, üç saat sonra. Her döngü kısa bir boşlukla biter ve aynı şey dakikada */7 ile (56'dan sonra dört dakikalık bir boşluk) ve aralığını tam bölmeyen diğer herhangi bir adımla olur. Dakikada */15 ve saatte */6 güvenlidir; insanların başvurduğu sayıların çoğu değildir.
Bu, adım işi yaymak için seçildiğinde önemlidir. */7 saatteki bir iş her yedi saatte bir çalışmaz ve yedi için boyutlandırılmış bir hız sınırı günde bir kez aşılır.
Haftanın günleri farklı yerlerde farklı numaralanır
Vixie cron günleri, her iki uçta Pazar olacak şekilde 0'dan 7'ye numaralar; böylece 0 ve 7 aynı gündür ve 1 Pazartesi'dir. Quartz ve EventBridge onları, Pazar 1'de olacak şekilde 1'den 7'ye numaralar; böylece orada 1 Pazar'dır ve 2 Pazartesi'dir.
Bir Quartz yapılandırmasından bir crontab'a kopyalanan bir ifade bu yüzden bir gün erken çalışır ve hiçbir yerde hiçbir şey şikâyet etmez, çünkü her iki yazım da her iki sistemde geçerli sayılardır. Üç harfli adlar — MON, FRI — her yerde aynı günü ifade eder ve basit savunmadır.
Yaz saati: yılda iki sabah
Bir cron artalan süreci anları çizelgelemez. Her dakika yerel duvar saatine bakar ve ifadenin eşleşip eşleşmediğini sorar. Yılda iki kez o saat iyi huylu bir dizi değildir.
İleri atladığında, bir saatlik okumalar hiç gerçekleşmez. 02:30 için ayarlanmış bir işin o gün bir 02:30'u yoktur. Geri gittiğinde, bir saatlik okumalar iki kez gerçekleşir ve 01:30 için ayarlanmış bir işin ikisi vardır.
Vixie cron burada iki tür işi ayırt eder ve ayrım bilmeye değer, çünkü işlerinizden hangilerinin etkilendiğine karar verir. Bir duvar saati saatine sabitlenmiş bir iş — sabit bir saat ve sabit bir dakika — her iki durumda da tam olarak bir kez çalıştırılır: ileri bir atlamadan sonra hemen çalışır ve geri bir atlamadan sonra cron onu tekrarlamamaya özen gösterir. Saat ya da dakikada bir yıldız olan bir iş bir aralık işidir ve yalnızca saati izler: ilkbaharda bir saatlik çalışma kaybeder ve sonbaharda bir saatlik çalışmayı tekrarlar.
Yani saatlik bir yedekleme gerçekten yılda bir gecede iki kez çalışır ve 02:30'daki gecelik bir iş gerçekten başka bir gecede olağandışı bir anda çalışır. Bu araç, seçilen zonun sonraki on iki ayını ifadenize karşı denetler ve ikisinden hangisinin geçerli olduğunu tarihiyle söyler.
Güvenilir çıkış yolu, işi UTC'de ya da hiçbir geçişin düşmediği yerel 01:00–03:00 dışında çizelgelemektir.
İşin gerçekte hangi saatte olduğu
Bir crontab, makinenin yerel zonunda ya da dosyanın başında CRON_TZ veya TZ ne derse orada çalışır. Bu, nadiren ifadeyi okuyan kişinin zonudur; buradaki saat diliminin, tarayıcınızınki yerine bir ayar olmasının nedeni budur.
Bir Kubernetes CronJob yine farklıdır: manifest bir timeZone alanı ayarlamadıkça, düğümün kendi saati ne derse desin, çizelgesini UTC'de okur. Yerel iş saatleri için yazılmış ve o alan olmadan dağıtılmış bir çizelge, UTC dışındaki her yerde günün yanlış saatinde çalışır — ve işe bağlı olarak ya bir hata ya da bir rahatlama olan, mevsimlerle değişmez.
Jenkins ve H
Jenkins, başka hiçbir lehçede olmayan bir belirteç ekler: rastgelelik gibi görünen ve olmayan H. Jenkins, işin adını alanın aralığı içinde sabit bir değere hash'ler; böylece iş her gün aynı zamanda — kendi zamanında — çalışır; H * * * * yazılmış yüz iş ise hepsi dakikada başlamak yerine saat boyunca eşit yayılır.
Değer işin adından geldiği ve işin adı ifadenin parçası olmadığı için, hiçbir araç tam zamanları hesaplayamaz. Bu araç her H'yi aralığının en altına çözer ve bunu söyler: çizelgenin şekli — ne sıklıkla, hangi günlerde — tamdır ve yalnızca her dönem içindeki kayma bir vekildir.
Jenkins ayrıca makroları yeniden tanımlar. @daily'si @midnight'tır, ki bu gece yarısı değil, günün ilk üç saati içinde bir yerde hash'lenmiş bir dakikadır.
Cron'un yapmadığı şey
- Yetişmez. Bir çalışma zamanı geldiğinde makine uykudaysa ya da artalan süreci kapalıysa, o çalışma sonradan gerçekleşmez — yalnızca kaçırılır. anacron tam da bunun için vardır ve farklı bir programdır.
- Örtüşen çalışmaları durdurmaz. Bir iş aralıktan uzun sürerse, bir sonraki yine de başlar ve bir süre sonra birkaç tane olur. Bir kilit dosyası olağan yanıttır.
- Klasik biçimde saniye kavramı yoktur. En ince çözünürlük bir dakikadır; daha hızlı herhangi bir şey Quartz, systemd ya da işin içinde bir döngü gerektirir.
- @reboot bir çizelge değildir. Artalan süreci başladığında bir kez çalışır, dolayısıyla bir sonraki çalışması yoktur ve hiç yeniden başlatılmayan bir makinede hiç çalışmaz.
- EventBridge'deki bir rate ifadesi, kuralın oluşturulduğu andan itibaren sayar ve o an ifadede değildir; bu yüzden hiçbir araç bir sonraki tetiklemesini söyleyemez.
Sıkça sorulan sorular
- Bir işi ayın ilk Pazartesi'sinde nasıl çalıştırırım?
- Düz bir cron ifadesiyle değil — bu, iki gün alanı arasında bir «ve» gerektirir ve cron size bir «veya» verir. Standart geçici çözüm, 0 0 1-7 * * çizelgelemek ve komutun haftanın gününü kendisinin sınamasını sağlamaktır. Quartz ve EventBridge bunu doğrudan, 0 0 12 ? * MON#1 olarak ifade edebilir.
- 0 0 13 * 5 neden bu kadar sık çalışıyor?
- Çünkü 13. Cuma değil, ayın 13'ü ya da her Cuma anlamına gelir. İki gün alanı da kısıtlandığında ve hiçbiri bir yıldızla başlamadığında, cron işi biri eşleştiğinde çalıştırır. Klasik lehçede bir «ve» yazmanın yolu yoktur.
- */5 ile 0-59/5 arasındaki fark nedir?
- Dakika alanı için hiçbir şey: ikisi de 0, 5, 10 vb. verir. Fark, cron'un alanın bir yıldızla başlayıp başlamadığına bakarak «ve» ile «veya» arasında karar verdiği iki gün alanında ortaya çıkar — böylece */5 ve 0-59/5 aynı günleri seçer ama diğer gün alanıyla farklı birleşir.
- Saatler geri gittiğinde işim iki kez çalışır mı?
- Saat ya da dakikada bir yıldız varsa, evet: saati izler ve o saat iki kez gerçekleşir. Sabit bir saat ve dakika varsa, hayır — Vixie cron böyle bir işi bir kez çalıştırır. Bulgular paneli sizinkinin hangi durum olduğunu, geçerli olduğu tarihle söyler.
- Bir cron ifadesi hangi saat dilimini kullanır?
- Crontab'da CRON_TZ ya da TZ ayarlı değilse, makinenin zonu. Bir Kubernetes CronJob, manifest timeZone ayarlamadıkça UTC kullanır. Zon ifadenin parçası olmadığı için, bu araç tarayıcınızınkini varsaymak yerine onu sorar.
- Bir şeyi her 90 dakikada bir çizelgeleyebilir miyim?
- Tek bir ifade olarak değil, çünkü her alan bağımsız döner ve 90 dakika bir saate sığmaz. Olağan yazım iki ifadedir, 0 0,3,6,9,12,15,18,21 * * * ve 30 1,4,7,10,13,16,19,22 * * *, ki bunlar birlikte her 90 dakikada bir çalışma verir.
- Yapıştırdığım herhangi bir şey bir sunucuya gönderiliyor mu?
- Hayır. Ayrıştırma, açıklama ve tüm çizelge hesabı tarayıcınızda çalışır; hiçbir şey yüklenmez ya da günlüğe yazılmaz ve ağ bağlantısı olmadan çalışır.