Cron İfadesi Ayrıştırıcı

Boşlukla ayrılmış beş alan ya da @daily gibi bir kısayol.

Devraldığınız crontab, 0 */2 * * 1-5 ve 30 3 * JAN,JUL 1 gibi satırlarla dolu. Bu ayrıştırıcı her alanı tam olarak eşleştiği değerlere açar; böylece */2 ifadesinin neyi kapsadığını tahmin etmek yerine seçtiği on iki saati ve yanlarındaki sayıyı görürsünüz. Ayrıca normalleştirilmiş 5 alanlı biçimi, ifade bilinen bir tuzağa düştüğünde bir uyarıyı ve kendi saat diliminize göre hesaplanmış sonraki 5 çalışma zamanını alırsınız.

Bir cron ifadesi nasıl ayrıştırılır

  1. 1

    İfadeyi yapıştırın

    5 alanlı bir satır (`* * * * *`): dakika, saat, ayın günü, ay ve haftanın günü. `@daily` gibi kısayollar da çalışır.

  2. 2

    Alanların açılımını okuyun

    Her alan, eşleştiği değerler ve bu değerlerin kaç tane olduğuyla birlikte listelenir; böylece saat alanındaki `*/2`, kapsadığı 0, 2, 4 ve diğer dokuz saati gösterir.

  3. 3

    Sonraki çalışma önizlemesini kontrol edin

    Gelecek 5 tetikleme zamanı, tarayıcınızda ve kendi saat diliminize göre hesaplanır. Niyetinizle örtüşmüyorlarsa ifadeyi düzeltin.

  4. 4

    Uyarıları okuyun

    Ayrıştırıcı tuzakları işaretler: iki gün alanının birden belirtilmesi, hiçbir zaman gerçekleşmeyecek bir tarih ya da standart cronda bulunmayan bir operatör.

Her alan neye açılır

Bir alan tek bir değer değil, bir kümedir. Bu kümenin ne kadar büyük olduğunu bilmek, buraya getirdiğiniz sorunun cevabını çoğu zaman tek başına verir.

Alan Aralık * ile eşleşen Notlar
Dakika 0-59 60 değer Kontrolden çıkan görevlerin en yaygın kaynağı
Saat 0-23 24 değer 24 saatlik düzen, asla 1-12 değil
Ayın günü 1-31 31 değer Kısa aylar olmayan günleri basitçe atlar
Ay 1-12 12 değer JAN ile DEC arasındaki adlar da kabul edilir
Haftanın günü 0-7 7 değer 0 da 7 de Pazar demektir

Bir alanın içindeki operatörler: * her değer, 1,5,10 bir liste, 1-5 bir aralık, */15 aralığın başından sayılan bir adım ve 0-45/15 bir aralığın içindeki adım.

Adlar ve kısayollar kabul edilir

Ay ve haftanın günü adları ayrıştırılır ve eşleştikleri sayılara açılır; bu yüzden 30 3 * JAN,JUL 1 satırında ay 1, 7, haftanın günü ise 1 olarak raporlanır. Adlandırılmış kısayollar ise, başka hiçbir şey çalışmadan önce 5 alanlı biçimlerine açılır:

Kısayol Açılımı Anlamı
@yearly, @annually 0 0 1 1 * 1 Ocak gece yarısı
@monthly 0 0 1 * * Her ayın 1’inde gece yarısı
@weekly 0 0 * * 0 Pazar gece yarısı
@daily, @midnight 0 0 * * * Her gün gece yarısı
@hourly 0 * * * * Her saat başı

@reboot de tanınır, ama açılacak bir zamanlaması yoktur: makine açıldığında bir kez çalışır, dolayısıyla önizlenecek bir çalışma zamanı da yoktur.

Okumaya değer uyarılar

  • İki gün alanı da sınırlandırılmış. 0 0 1 * MON satırı “ayın 1’i, ama yalnızca Pazartesiye denk gelirse” demek değildir. Standart cron, iki gün alanı da sınırlandırıldığında bunları VEYA ile birleştirir; yani o satır her ayın 1’inde ve her Pazartesi tetiklenir. Ayrıştırıcı bu uyarıyı verir, çalışma zamanı önizlemesi de VEYA kuralına uyar.
  • Hiç gerçekleşmeyen bir tarih. 0 0 30 2 * 30 Şubat tarihini ister. İfade sözdizimi açısından geçerlidir ve cron bunu kabul eder, ama hiçbir zaman tetiklenmez. Ayrıştırıcı, açıklamasız boş bir liste göstermek yerine bunu açıkça söyler.
  • Quartz operatörleri. L (son), W (en yakın hafta içi gün), # (ayın n’inci hafta günü) ve ? standart crontab’ın değil, Quartz’ın uzantılarıdır. 5 alanlı bir satırın içinde tanınır ve işaretlenirler; alan, bir değer listesi yerine bunun bir Quartz operatörü olduğunu gösterir. Çalışma zamanı hesaplanmaz, çünkü standart cron o satırı zaten hiç çalıştırmaz.

Doğrudan reddedilenler

  • Yanlış alan sayısı. Saniye içeren 6 alanlı bir Quartz satırı ya da yıl içeren 7 alanlı bir satır, alan sayısı yüzünden reddedilir.
  • Aralık dışı değerler, örneğin dakika 75 ya da ay 13.
  • Geriye doğru yazılmış bir aralık, örneğin 5-1.
  • Sıfır adım, örneğin */0.

Her ret mesajı, buna yol açan alanı ve değeri adıyla söyler; böylece satırın tamamını yeniden yazmak yerine tek bir şeyi düzeltirsiniz.

Saat dilimi

Sonraki çalışma önizlemesi tarayıcınızda, cihazınızın ayarlı olduğu saat dilimine göre hesaplanır. Bir crontab ise kendisini barındıran makinenin saat diliminde çalışır; o sunucu UTC üzerinde çalışıyorsa ve siz başka bir saat dilimindeyseniz, karşılaştırmadan önce saatleri buna göre kaydırın.

Sık Sorulan Sorular

Zamanlama olarak hayır. Saniye içeren 6 alanlı bir Quartz satırı ya da yıl içeren 7 alanlı bir satır, alan sayısı yüzünden reddedilir. Normal 5 alanlı bir satırın içindeki Quartz operatörleri (L, W, #, ?) ise ayrı bir durumdur: tanınır ve işaretlenirler, ama çalışma zamanı hesaplanmaz, çünkü standart cron o satırı da çalıştırmaz.

Genellikle iki nedenden biri: cihazınız ile crontab’ı çalıştıran sunucu arasındaki saat dilimi farkı ya da iki gün alanının birden belirtilmiş olması. Ayın günü ve haftanın günü birlikte sınırlandırıldığında cron, ikisi birden değil, herhangi biri eşleştiğinde tetiklenir; bu yüzden 0 0 1 * MON çoğu kişinin beklediğinden çok daha sık çalışır. Her alanın yanındaki değer sayısı, sandığınızdan geniş bir alanı fark etmenin en hızlı yoludur.

Evet. Kubernetes standart 5 alanlı sözdizimini kullanır. Ayarlamanız gereken tek şey saat: bir CronJob, kümenin saat diliminde çalışır (spec.timeZone başka bir şey söylemiyorsa UTC), buradaki önizleme ise kendi cihazınızın saat dilimini kullanır.

Bunlar, beş alan yazmak yerine Linux cronda kullanabileceğiniz adlandırılmış kısayollardır. @daily (aynı zamanda @midnight) 0 0 * * *, @weekly 0 0 * * 0, @monthly 0 0 1 * *, @yearly (aynı zamanda @annually) 0 0 1 1 * ve @hourly 0 * * * * demektir. Bunlardan herhangi birini yapıştırın; ayrıştırıcı size açıldığı 5 alanlı biçimi gösterir. @reboot istisnadır: sistem açılışında çalışır, bu yüzden ne bir zamanlaması ne de çalışma zamanı vardır.

İlgili Araçlar

Araç diğer dillerde mevcuttur