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 Buğra SözeriPublished
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-komutHer 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 saatte0,30 * * * *— saat başı ve yarısında5,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 saatte0 9-17 * * *— saat başı, 09:00'dan 17:00'e kadar
Günlük varyantlar
0 0 * * *— her gün gece yarısı (@dailyeşdeğeri)30 3 * * *— her gün 03:30 — klasik yedekleme penceresi0 9 * * 1-5— hafta içi 09:000 18 * * 5— yalnızca Cuma günleri 18:00
Haftalık, aylık, yıllık
0 9 * * 1— her Pazartesi 09:000 0 1 * *— her ayın birinde gece yarısı (@monthlyeşdeğeri)0 0 1 1 *— 1 Ocak gece yarısı (@yearlyeş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 0Saat 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ı
| İfade | Anlam |
|---|---|
* * * * * | her dakika |
*/5 * * * * | her 5 dakikada |
0 * * * * | her saat başı |
0 9-17 * * 1-5 | saatlik, 9-5, hafta içi |
0 0 * * * | her gece yarısı |
30 3 * * 0 | her Pazar 03:30 |
0 0 1 * * | her ayın birinde gece yarısı |
0 0 1 1 * | 1 Ocak gece yarısı |
@reboot | zamanlayı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.
- POSIX crontab(5) — The Open Group Base Specifications Issue 7 — Beş alanlı sözdizimi ve alan aralıkları için standart spec(as of )
- crontab(5) — Vixie cron / Linux man sayfası — Adım değerleri, adlandırılmış aylar/hafta günleri ve @-kısaltmaları için referans(as of )
- systemd.timer(5) — freedesktop.org — SSS'deki karşılaştırma için kullanılan modern alternatif(as of )
- IANA Saat Dilimi Veritabanı — DST tartışmasında başvurulan bölge tanımlayıcıları için yetkili kaynak(as of )
Related
Published May 31, 2026