Crontab Guru

Bir cron ifadesi yapıştırın ve ne yaptığının alan alan açıklamasını sade İngilizce alın. Alan sırasını hatırlamanıza ya da aralıkları aramanıza gerek yok: guru beş alanın her birini (dakika, saat, ayın günü, ay ve hafta günü) tek tek ele alır ve ifadeyi soldan sağa okur. Bir crontab satırını dağıtmadan önce kontrol etmek ya da devraldığınız bir satırı açıklamak için kullanışlıdır.

Guru nasıl kullanılır

  1. 1

    İfadeyi yapıştırın

    Herhangi bir standart 5 alanlı cron ifadesini (örneğin `0 9 * * 1-5`) giriş alanına kopyalayın.

  2. 2

    Açıklama isteyin

    Explain Cron düğmesine tıklayın; araç her alanın satır satır açıklamasını verir: dakika, saat, ayın günü, ay ve hafta günü.

  3. 3

    Açıklamayı okuyun

    Açıklama İngilizce üretilir; örneğin "Minute: every 5 minutes" ya da "Hour: from 9 through 17."

  4. 4

    Dağıtmadan önce kontrol edin

    Zamanlamanın istediğiniz şeyi yaptığından emin olmak için açıklamayı kullanın; ardından crontab'ınıza, CI yapılandırmanıza ya da Kubernetes manifestonuza koyun.

Alan kopya kâğıdı

 ┌───────────── dakika (0-59)
 │ ┌─────────── saat (0-23)
 │ │ ┌───────── ayın günü (1-31)
 │ │ │ ┌─────── ay (1-12 ya da JAN-DEC)
 │ │ │ │ ┌───── hafta günü (0-6 ya da SUN-SAT; Pazar = 0 ya da 7)
 │ │ │ │ │
 * * * * *

Cron ifadelerindeki operatörler

Operatör Anlamı Örnek
* Her değer * * * * *
, Değer listesi 0,15,30,45
- Aralık 9-17
/ Adım (başlangıç/adım) */5, 0-30/5
L Son (ayın son günü ya da son hafta günü, Quartz) L, 5L
W En yakın hafta günü 15W (Quartz)
# Ayın n’inci hafta günü 1#3 (Quartz)
? Belirli değer yok Yalnızca Quartz

Okuma sırası önemlidir

0 */2 * * 1-5 soldan sağa şöyle okunur: dakika 0, her 2 saatte bir, ayın herhangi bir günü, herhangi bir ay, Pazartesiden Cumaya. İnsanlar bazen alışkanlıkla alanları sağdan sola okur ve kafaları karışır; her zaman dakikadan başlayın.

“Her X dakikada bir” tuzağı

*/10 * * * * 0, 10, 20, 30, 40, 50. dakikalarda tetiklenir, “iş ne zaman oluşturulduysa ondan itibaren her 10 dakikada bir” değil. Cron adımları her zaman alanın aralığının başından ölçer. Bir işi 12:03’te dağıtırsanız, ilk çalışma 12:10’da olur, 12:13’te değil.

Gerçekten “son çalışmadan N dakika sonra” gerektiren işler için kalıcı bir zamanlayıcılı bir scheduler kullanın (OnUnitActiveSec ile systemd zamanlayıcıları ya da saklanan bir son çalışma zaman damgasıyla uygulama düzeyinde zamanlama).

Bilinmeye değer cron tuzakları

  • Ayın günü + hafta günü her ikisi de ayarlı: çoğu cron uygulaması bunu OR davranışı olarak ele alır, muhtemelen istediğiniz şey değil.
  • 0 adımı: */0 geçersizdir.
  • Aralık başa sarar: saatler için 22-2 klasik cronda çalışmaz; 22-23,0-2 kullanın.
  • 30 Şubat: 0 0 30 2 * gibi bir zamanlama asla tetiklenmez.
  • DST belirsizliği: 2 ile 3 arasında zamanlanan işler DST geçiş günlerinde iki kez ya da sıfır kez tetiklenebilir.

Cron ve modern zamanlayıcılar

Unix cron hâlâ her yerde, ama kritik bir şey için muhtemelen şunları istersiniz:

  • systemd zamanlayıcıları: kaçırılan çalışmaları yakalar, rastgele kaydırmaları destekler, birim dosyalarından okur.
  • Kubernetes CronJob: bildirimsel, yeniden denemeler, 1.25+’ta saat dilimi farkında.
  • Airflow / Prefect / Dagster: bağımlılıkları, yeniden denemeleri, geri doldurmaları, gözlemlenebilirliği olan işler için.
  • GitHub Actions zamanlaması: 5 alanlı cron, yalnızca UTC, minimum 5 dakikalık aralık, en iyi çaba teslimi.

Cron, başlı başına harika bir biçimdir ama kaçırılmaması gereken işler için zayıf bir zamanlayıcıdır.

Sık Sorulan Sorular

Çünkü standart cronda hafta günü 0 Pazardır (7 de Pazardır, her iki geleneği destekler). Pazartesi 1’dir. Quartz hafta günlerini 1-7 numaralandırır, Pazar = 1; bu da lehçeler arasında geçiş yapanları sık tökezletir.

Klasik Unix cron sunucunun yerel saat diliminde çalışır, /etc/timezone ne diyorsa. Kubernetes CronJob, GitHub Actions ve çoğu bulut zamanlayıcısı varsayılan olarak UTC’de çalışır. Her zaman doğrulayın ve mümkünse DST sürprizlerinden kaçınmak için UTC kullanın.

Klasik cron bunu doğrudan ifade edemez. Geçici çözüm: her Pazartesi çalıştırın ve tarihi betiğin içinde kontrol edin: [ $(date +%d) -le 7 ] && ./job.sh. Quartz bunu 1#1 ile yerel olarak destekler.

Hayır. Her zamanlamanın kendi satırı gerekir. Ama birkaç zamanlamayı listelerle tek bir satırda birleştirebilirsiniz: 0 9,17 * * * sabah 9’da ve 17’de çalışır. Tek satır olarak ifade edilemeyen zamanlamalar için aynı komutu gösteren birden fazla satır ekleyin.

İlgili Araçlar