Skip to content

Guide

Cron İfadesi Eğitimi: Crontab Zamanlamalarını Okuma ve Yazma

Beş alan, altı özel karakter ve işinizin bir mi yoksa iki mi kez çalışacağına karar veren bir tarihi hata.

By Published

Cron kırk yaşında ve bu yıl gönderilen neredeyse her Unix sisteminde varsayılan zamanlayıcı olmaya devam ediyor. Sözdizimi tek satıra sığıyor — hayatta kalmasının büyük nedeni bu — ve aynı zamanda güvenilir biçimde yanlış okunmasının da nedeni. Bu rehber beş alanı, her özel karakteri, ay-günü ile hafta-günü tuhaflığını ve doğrudan bir crontab'a kopyalayabileceğiniz küçük bir ifade kütüphanesini inceliyor.

Beş alanlı yapı

POSIX cron ifadesinde boşlukla ayrılmış beş alan var, bu sırayla:

# ┌──────────── dakika        (0 - 59)
# │ ┌────────── saat          (0 - 23)
# │ │ ┌──────── ayın günü     (1 - 31)
# │ │ │ ┌────── ay            (1 - 12)  veya OCA-ARA
# │ │ │ │ ┌──── haftanın günü (0 - 6)   veya PAZ-CMT, 0 ve 7 Pazar
# │ │ │ │ │
  *  *  *  *  *   çalıştırılacak-komut

Her alan mevcut olmalıdır. Varsayılan değer yok ve konumsal kısayol yok. * içeren bir alan "bu aralıktaki her geçerli değer" anlamına gelir, "atla" değil. Bu ayrım alanları birleştirmeye başlar başlamaz önem kazanır.

Bazı varyantlar başa altıncı bir saniye alanı (Quartz, Spring'in @Scheduled) veya sona yedinci bir yıl alanı ekliyor. Bunlar uzantılar, POSIX değil. Taşınabilirlik için beşe bağlı kalın.

Neden iki gün alanı var?

Cron aynı satırda "her Pazartesi" ve "ayın birinci günü" demenize izin veriyor; her iki alan da aynı fikirde olmak zorunda olsaydı belirsiz olurdu. Tarihi çözüm, her iki alan da kısıtlandığında VEYA semantiğidir: iş, ay-günü veya hafta-günü eşleştiğinde tetiklenir. Buna döneceğiz; tek en yaygın cron hatasıdır.

Özel karakterler

* — her değer

Alandaki her geçerli değerle eşleşir. * * * * * her saatin her dakikasının her gününün her dakikası anlamına gelir. Bu gerçekten saatte altmış kez tetiklenen tek ifadedir.

, — liste

Virgül ayrı değerleri ayırır. 0,15,30,45 * * * * her saatin başında, çeyreği geçe, yarısında ve çeyreğine çeyrekte tetiklenir.

- — aralık

Kısa çizgi kapsayıcı bir aralık tanımlar. 0 9-17 * * 1-5 Pazartesi'den Cuma'ya kadar 09:00'dan 17:00'e kadar her saatin başında tetiklenir. Her iki uç nokta dahildir; günde dokuz çalışma, sekiz değil.

/ — adım

Eğik çizgi bir aralığa adım uygular. Dakikalar alanında */5, 0-59/5 kısaltmasıdır — dakika 0'dan başlayarak her beş dakikada. Tuzak: */N mevcut saat zamanınızı değil, tam aralığı böler. Dakikalarda */7 0, 7, 14, 21, 28, 35, 42, 49, 56'da tetiklenir — ardından sonraki saatin 0'ı, dört dakikalık boşluk. Cron periyodik zamanlayıcı değildir.

? — belirli değer yok (yalnızca Quartz)

? karakteri POSIX değil. Quartz aromalı cron'da (ve Quartz sözdizimini miras alan AWS EventBridge'de) görünür ve "belirli değer yok — diğer gün alanı yetkilidir" anlamına gelir.

Adlandırılmış değerler

Aylar OCA ŞUB MAR NİS MAY HAZ TEM AĞU EYL EKİ KAS ARA'yı, hafta günleri PAZ PZT SAL ÇAR PER CUM CMT'yi kabul eder. Çoğu uygulamada büyük/küçük harf duyarsız ama birkaçında duyarlı; büyük harf güvenli seçimdir.

Tarifler

Cron'u içselleştirmenin en hızlı yolu, onlarca ifadeyi sade Türkçe'nin yanında okumaktır. Bunlardan herhangi birini, yerel bölgenizde sonraki on tetikleme zamanını görmek için cron ifadesi oluşturucumuza yapıştırın.

Her N dakikada bir

  • * * * * * — her dakika
  • */5 * * * * — her beş dakikada, 0, 5, 10… dakikada
  • */15 * * * * — her çeyrek saatte
  • 0,30 * * * * — saat başı ve yarısında
  • 5,35 * * * * — beş dakika kaydırılmış — aynı veritabanı için yarışan işleri dağıtmak için kullanışlı

Saatlik varyantlar

  • 0 * * * * — her saat başı
  • 0 */2 * * * — 00:00'dan başlayarak her iki saatte
  • 0 9-17 * * * — saat başı, 09:00'dan 17:00'e kadar

Günlük varyantlar

  • 0 0 * * * — her gün gece yarısı (@daily eşdeğeri)
  • 30 3 * * * — her gün 03:30 — klasik yedekleme penceresi
  • 0 9 * * 1-5 — hafta içi 09:00
  • 0 18 * * 5 — yalnızca Cuma günleri 18:00

Haftalık, aylık, yıllık

  • 0 9 * * 1 — her Pazartesi 09:00
  • 0 0 1 * * — her ayın birinde gece yarısı (@monthly eşdeğeri)
  • 0 0 1 1 * — 1 Ocak gece yarısı (@yearly eşdeğeri)

İş saatleri

  • 0 9-17 * * 1-5 — saat başı, 09:00-17:00, Pazartesi-Cuma — iş günü başına dokuz tetikleme
  • */10 9-17 * * 1-5 — iş saatlerinde her on dakikada

Ay-günü / hafta-günü VEYA tuhaflığı

Cron'da en çok sorulan davranış budur ve spec açıktır: hem ay-günü alanı hem de hafta-günü alanı kısıtlıysa (yani * değilse), iş her iki koşuldan herhangi biri eşleştiğinde tetiklenir, ikisi birden değil.

0 0 1 * 1'i düşünün. Doğal okuma "ayın birinde gece yarısı ama yalnızca Pazartesi ise" şeklindedir. Gerçek davranış "her ayın birinde gece yarısı veya her Pazartesi gece yarısı"dır. Bu ayda yaklaşık beş tetikleme demektir, muhtemelen istediğiniz sıfır-bir değil.

Geçici çözüm: iki gün alanından birini * olarak bırakın. VE semantiğine gerçekten ihtiyaç duyuyorsanız — "ayın ilk Pazartesi'si" — script içinde kontrol etmeniz gerekecek.

# crontab: ayın ilk yedi gününde gece yarısı tetikle
0 0 1-7 * *  /usr/local/bin/maybe-run-monthly.sh

# maybe-run-monthly.sh içinde: bugün Pazartesi değilse çık
[ "$(date +%u)" = "1" ] || exit 0

Saat dilimleri ve DST

Cron ifadeleri zamanlayıcının yerel saat diliminde değerlendiriliyor. Linux'ta /etc/localtime'ın sembolik bağlantı yaptığı şey; macOS'ta sistem tercihi. İfadenin kendisi asla bir dilimi adlandırmıyor.

Bu, DST geçişlerini ilginç kılıyor. DST gözlemleyen bir bölgede 0 2 * * *'daki bir cron işi bahar ileri günü hiç tetiklenmeyebilir — 02:00 saati yoktu — ve sonbaharda iki kez tetiklenebilir.

Çoğu bulut zamanlayıcı kural başına açık saat dilimi kabul ediyor; IANA bölge tanımlayıcıları gibi America/New_York doğrudur, EST değildir (DST gözlemlemiyor). Mutlak tutarlılık gerekiyorsa, 03:00 ile 23:00 arasında zamanlayın veya zamanlayıcıyı UTC'de çalıştırın.

Yaygın hatalar

Eğik çizgiye gerçek periyot muamelesi yapmak

*/N alan aralığını böler, dolayısıyla bir saatin son tetiklemesi ile bir sonrakinin ilk tetiklemesi arasındaki periyot N'den daha kısa. Kesin N-dakikalık aralama gerekiyorsa, cron yanlış araçtır.

0. dakikanın var olduğunu unutmak

0-59/15 saatte dört kez değil, 0, 15, 30, 45'te tetikler. Aralık 0'dan başlar.

Komuttan sonra yorum koymak

Cron, beşinci alandan sonraki satırın tamamını tek bir komut olarak kabul eder. Yorumları zamanlamanın üstündeki kendi satırlarına koyun.

İşin PATH'ini varsaymak

Cron minimal bir ortamla çalışır. PATH genellikle /usr/bin:/bin'dir ve shell takma adlarınız yoktur. Her ikili için mutlak yol kullanın veya crontab'ın üstünde PATH= ayarlayın. Bir iş "elle çalıştırdığımda ama cron'dan değil" çalışıyorsa, neredeyse her zaman bu nedendir.

Stdout'un gelen kutusunu doldurmasına izin vermek

Cron, her işin çıktısını varsayılan olarak yerel kullanıcıya e-postayla gönderiyor. Her komuta >>/var/log/myis.log 2>&1 ekleyin ve günlüğü döndürün.

Hızlı başvuru kartı

İfadeAnlam
* * * * *her dakika
*/5 * * * *her 5 dakikada
0 * * * *her saat başı
0 9-17 * * 1-5saatlik, 9-5, hafta içi
0 0 * * *her gece yarısı
30 3 * * 0her Pazar 03:30
0 0 1 * *her ayın birinde gece yarısı
0 0 1 1 *1 Ocak gece yarısı
@rebootzamanlayıcı başlangıcında bir kez (sisteme bağlı)

Kaydetmeden önce doğrulayın

Sabah 3'teki alarm sayfasından kaçınmanın en ucuz yolu, crontab'ı kaydetmeden önce ifadenizi bir ayrıştırıcıya yapıştırmaktır. Cron ifadesi oluşturucumuz yerel bölgenizde ve UTC'de sonraki on tetikleme zamanını ve ay-günü / hafta-günü tuhaflığını anında yakalayan sade Türkçe açıklaması yazdırıyor.

Frequently asked questions

Cron sunucu saat dilimini mi yoksa UTC'yi mi kullanır?
Klasik Unix cron, /etc/localtime'ın işaret ettiği sistem yerel saat dilimini kullanır. Birçok bulut zamanlayıcı (AWS EventBridge, GCP Cloud Scheduler) UTC'yi varsayılan olarak kullanır ve kural başına adlandırılmış bir IANA dilimi seçmenize izin verir. Yaz saati uygulaması sonrası hataların tüm bir kategorisini ortadan kaldırmak için işin ilk kayıt satırında çözülen saat dilimini her zaman yazdırın.
Yaz saatinin sona erdiği sabah işim neden iki kez çalıştı?
Saatler 02:00'den 01:00'e geri döndüğünde, 01:00 ile 02:00 arasındaki saat yerel saatte iki kez yaşanır. DST gözlemleyen bir bölgede 01:30'da zamanlanan bir iş, cron uygulamanız açıkça tekilleştirmedikçe her iki seferinde de çalışır. Düzeltme ya 03:00 ile 23:00 arasında zamanlama yapmak (belirsiz pencere içinde asla değil) ya da zamanlayıcıyı UTC'de çalıştırmaktır.
Cron'un desteklediği en küçük aralık nedir?
Bir dakika. İlk alan dakikadır; POSIX crontab'da saniye alanı yoktur. Dakika altı zamanlama gerekiyorsa kendi uyku döngüsüyle uzun süre çalışan bir süreç, OnUnitActiveSec içeren systemd zamanlayıcıları veya saniye alanını destekleyen Quartz gibi özel bir zamanlayıcı kullanın.
@hourly, @daily, @reboot taşınabilir mi?
Kısaltma dizeleri (@yearly, @monthly, @weekly, @daily, @hourly) Vixie cron, cronie ve çoğu modern türev tarafından destekleniyor, dolayısıyla Linux ve macOS'ta güvenliler. @reboot yaygın biçimde destekleniyor ancak semantiği farklı — bazı uygulamalar bir kez çalıştırıyor, bazıları her önyüklemede. Konteynerlerde @reboot kullanmayın; bunun yerine konteynerin kendi başlatma komutunu kullanın.
*/7 neden bazen son aralığı atlıyor?
Adım operatörü başlangıç zamanınızı değil, izin verilen aralığın tamamını böler. Dakikalar (0-59) için */7, 0, 7, 14, 21, 28, 35, 42, 49, 56'da tetiklenir — ardından bir sonraki geçerli dakika sonraki saatin 0'ıdır. 56 ile 60 arasındaki boşluk yalnızca dört dakikadır, yedi değil. Kesin yedi dakikalık periyoda ihtiyacınız varsa cron değil gerçek aralık zamanlayıcısı olan bir zamanlayıcı kullanın.
2026'da cron mu yoksa systemd zamanlayıcıları mı kullanmalıyım?
Orkestratörü olmayan tek bir Linux ana bilgisayarında systemd zamanlayıcıları genellikle daha iyi bir varsayılandır: journalctl aracılığıyla yapılandırılmış kayıt, bağımlılık sıralaması, RandomizedDelaySec ile daha kolay rastgeleleştirme ve birim düzeyinde kaynak sınırları. Cron, systemd olmayan sistemler arasında taşınabilirlik gerektiğinde veya tüm otomasyon bir crontab satırı olduğunda kazanır. Konteyner orkestrasyonlu ortamlarda hiçbiri değil — platformun yerel zamanlayıcısını kullanın (Kubernetes CronJob, ECS Scheduled Tasks vb.).

Sources & references

Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.

Related

Published May 31, 2026