Menü
dev 10 dk okuma |

Cron İşleri (Cron Jobs) Kılavuzu: Geliştiriciler İçin Tam Rehber

Tekrarlayan görevleri otomatikleştirmek, her geliştirici veya sistem yöneticisi için temel bir beceridir. Günlük yedeklemeler yapmak, bülten e-postaları göndermek veya geçici günlük (log) dosyalarını temizlemek olsun, bu komutları her seferinde manuel olarak çalıştırmak istemezsiniz. Unix benzeri işletim sistemleri dünyasında (Linux, macOS, BSD), görev zamanlamasını yönetmenin standart yolu Cron kullanmaktır.

Kavram basit olsa da, cron ifadelerinin sözdizimi yeni başlayanlar için göz korkutucu olabilir. Bu kılavuz, basit bir betikten karmaşık bakım rutinlerine kadar her şeyi planlamanız için size bilgi sağlayarak cron işlerinin mekanizmasına derinlemesine bir bakış sunar. Aceleniz varsa, anında geçerli ifadeler oluşturmak için her zaman Cron İş Oluşturucumuzu (Cron Job Generator) kullanabilirsiniz.

Cron İşlemi (Cron Job) Nedir?

"Cron işi", sistemin belirli aralıklarla veya belirli zamanlarda otomatik olarak yürüttüğü zamanlanmış bir görevdir. Adı, Yunanca zaman anlamına gelen chronos kelimesinden gelir. Bu görevleri yönetmekten sorumlu hizmete crond (cron daemon) adı verilir; bu hizmet arka planda çalışır ve her dakika yapılandırma dosyalarını (crontab'lar) kontrol ederek yürütülmesi gereken herhangi bir görev olup olmadığına bakar.

Cron işleri şunlar için gereklidir:

  • Sistem Bakımı: Günlüklerin döndürülmesi, önbelleklerin temizlenmesi ve sistem paketlerinin güncellenmesi.
  • Veritabanı İşlemleri: Periyodik yedeklemeler ve indeks optimizasyonu.
  • Uygulama Görevleri: Zamanlanmış bildirimler gönderme, kuyrukları işleme veya veri kazıma (scraping).
  • DevOps Otomasyonu: Dağıtımları (deployments) veya sağlık kontrollerini tetikleme.

Cron İfadesi Sözdizimini Anlamak

Herhangi bir cron işinin kalbi cron ifadesidir; bu ifade, boşluklarla ayrılmış beş (veya bazen altı) alandan oluşan bir dizedir. Her alan belirli bir zaman birimini temsil eder. Geçerli sistem saati ifadedeki desenle eşleştiğinde, ilişkili komut yürütülür.

Standart format şöyledir:

* * * * *
- - - - -
| | | | |
| | | | +----- Haftanın günü (0 - 6) (Pazar=0 veya 7)
| | | +------- Ay (1 - 12)
| | +--------- Ayın günü (1 - 31)
| +----------- Saat (0 - 23)
+------------- Dakika (0 - 59)

1. Dakika (0 - 59)

Bu alan, görevin saatin kaçıncı dakikasında başlayacağını belirler. Örneğin, 15 * * * * görevi her saatin 15. dakikasında çalıştırır.

2. Saat (0 - 23)

İkinci alan günün saatini belirtir. Cron'un 24 saatlik bir saat kullandığını unutmayın. 0 13 * * * her gün saat 13:00'te çalışır.

3. Ayın Günü (1 - 31)

Bu alan takvim gününü tanımlar. 0 0 1 * * belirtirseniz, görev her ayın ilk günü gece yarısı çalışır.

4. Ay (1 - 12)

Dördüncü alan ayı belirtir. Sayıları (1-12) veya ay adının ilk üç harfini (JAN, FEB, MAR vb.) kullanabilirsiniz.

5. Haftanın Günü (0 - 6)

Görevin haftanın hangi günü çalışacağını tanımlar. 0 ve 7'nin her ikisi de Pazar'ı temsil eder. Ayrıca üç harfli kısaltmalar da kullanabilirsiniz (SUN, MON, TUE vb.). Kritik Not: Çoğu cron uygulamasında, hem "Ayın Günü" hem de "Haftanın Günü" belirtilmişse, görev her iki koşuldan biri karşılandığında çalışacaktır.

Cron İfadelerindeki Özel Karakterler

Zamanlamayı daha esnek hale getirmek için cron birkaç özel karakteri destekler:

Yıldız (*) - "Her"

Yıldız, bir alan için tüm olası değerleri temsil eden bir joker karakterdir. * * * * * her dakika, her saat, her gün vb. anlamına gelir.

Virgül (,) - "Değer Listesi"

Bir değer listesi belirtmek için virgül kullanın. 0 8,12,18 * * * komutu her gün saat 08:00, 12:00 ve 18:00'de çalıştıracaktır.

Tire (-) - "Aralık"

Tire, bir değer aralığı tanımlamanıza olanak tanır. 0 9-17 * * 1-5 görevi hafta içi (Pazartesi'den Cuma'ya) saat 09:00 ile 17:00 arasında her saat başı çalıştırır.

Eğik Çizgi (/) - "Adım Değerleri"

Eğik çizgi artışlar için kullanılır. */15 * * * * "her 15 dakikada bir" anlamına gelir. Dakika alanındaki 0,15,30,45 ifadesinin kısaltmasıdır.

Yaygın Cron Örnekleri

Başlamanıza yardımcı olacak sık kullanılan bazı desenler şunlardır:

  • Her dakika: * * * * *
  • Her 5 dakikada bir: */5 * * * *
  • Her saat başı (0. dakikada): 0 * * * *
  • Her gün gece yarısı: 0 0 * * *
  • Her Pazar saat 03:00'te: 0 3 * * 0
  • Her hafta içi saat 09:00'da: 0 9 * * 1-5
  • Ayda iki kez (1. ve 15. günler) saat 22:00'de: 0 22 1,15 * *

Standart Olmayan Özel Dizeler

Birçok modern cron sürümü (Vixie Cron gibi), yaygın aralıklar için kısaltılmış takma adları destekler:

  • @reboot : Başlangıçta bir kez çalıştır.
  • @yearly veya @annually : Yılda bir kez çalıştır (0 0 1 1 *).
  • @monthly : Ayda bir kez çalıştır (0 0 1 * *).
  • @weekly : Haftada bir kez çalıştır (0 0 * * 0).
  • @daily veya @midnight : Günde bir kez çalıştır (0 0 * * *).
  • @hourly : Saatte bir kez çalıştır (0 * * * *).

Crontab'ınızı Yönetme

Bir Linux sistemindeki her kullanıcının kendi "crontab" (cron tablosu) dosyası vardır. Bununla etkileşim kurmak için crontab komutunu kullanın:

  • crontab -e: Crontab'ınızı varsayılan metin düzenleyicide açar. Planlarınızı buraya ekler veya değiştirirsiniz.
  • crontab -l: Crontab'ınızın mevcut içeriğini görüntüler.
  • crontab -r: Tüm crontab'ınızı kaldırır. Dikkatli kullanın!
  • crontab -u kullaniciadi -e: (Yalnızca Root) Başka bir kullanıcının crontab'ını düzenler.

Yaygın Tuzaklar ve En İyi Uygulamalar

Deneyimli geliştiriciler bile genellikle cron işlerinde sorunlarla karşılaşırlar. İşte en yaygın sorunlardan kaçınmanın yolları:

1. Minimal Ortam

Cron işleri çok temel bir ortam değişkeni setiyle çalışır. Etkileşimli kabuğunuzda sahip olduğunuz $PATH (örneğin /usr/local/bin) mevcut olmayabilir. Hem komutlar hem de yürüttüğünüz betikler için her zaman mutlak yolları kullanın. python script.py yerine /usr/bin/python3 /home/user/scripts/script.py kullanın.

2. Çalışma Dizini

Varsayılan olarak, cron işleri genellikle kullanıcının ana dizininde yürütülür. Betiğiniz göreli dosya yollarına bağlıysa başarısız olabilir. Önce doğru dizine cd yapmak iyi bir uygulamadır: * * * * * cd /path/to/app && ./run.sh.

3. Çıktıyı Yakalama (Günlük Tutma)

Varsayılan olarak cron, işin çıktısını (stdout ve stderr) kullanıcıya e-posta ile göndermeye çalışır. Posta yapılandırılmamışsa, çıktı genellikle kaybolur. İşlerinizi hata ayıklamak ve izlemek için çıktıyı bir günlük dosyasına yönlendirin:

* * * * * /path/to/command >> /var/log/myjob.log 2>&1

2>&1 kısmı, hem standart çıktının hem de hata mesajlarının yakalanmasını sağlar.

4. İzin Sorunları

Çalıştırmaya çalıştığınız betiğin yürütülebilir olduğundan emin olun. Doğru izinleri ayarlamak için chmod +x script.sh kullanın. Ayrıca, bir cron işinin crontab'ın sahibi olan kullanıcının izinleriyle çalıştığını unutmayın.

5. Eşzamanlı Yürütme

Bir işin çalışması planlandığı aralıktan daha uzun sürerse (örneğin 10 dakika süren ancak her 5 dakikada bir planlanan bir yedekleme betiği), aynı anda çalışan birden fazla örnekle karşılaşabilirsiniz. Bu, yüksek sunucu yüküne veya veri bozulmasına neden olabilir. Bunu önlemek için flock gibi bir kilitleme mekanizması kullanın:

*/5 * * * * /usr/bin/flock -n /tmp/myjob.lock /path/to/script.sh

Cron'a Modern Alternatifler

Cron güvenilir olsa da, sınırlamaları vardır (dakika altı zamanlama veya yerleşik yeniden deneme mantığı olmaması gibi). İhtiyaçlarınıza bağlı olarak şunları düşünebilirsiniz:

  • Systemd Timers: Çoğu Linux dağıtımında cron'un modern alternatifi. Daha iyi günlükleme ve bağımlılık yönetimi sağlar.
  • GitHub Actions / GitLab CI: Kod depolarıyla ilgili zamanlanmış görevler için.
  • Kubernetes CronJobs: Konteyner tabanlı iş yükleri için.
  • Görev Kuyrukları (Celery, BullMQ): Yeniden denemeler ve eşzamanlılık kontrolü ile daha karmaşık uygulama düzeyinde görev zamanlaması için.

Sonuç

Cron, bir geliştiricinin araç setindeki en önemli araçlardan biri olmaya devam ediyor. Sözdiziminde ustalaşarak ve günlükleme ile ortam yönetimi için en iyi uygulamaları takip ederek, sağlam ve kendi kendini koruyan sistemler oluşturabilirsiniz. Zamanlanmış betiklerinizdeki zamana özgü mantığı hata ayıklamanız gerekiyorsa Unix Zaman Damgası Dönüştürücümüzü veya otomatik görevlerinizde API verilerini işliyorsanız JSON'dan TypeScript'e aracımızı kullanmayı unutmayın.

Düzgün zamanlanmış görevler, modern altyapının sessiz kahramanlarıdır. Onları doğru şekilde ayarlamak için zaman ayırın; size sayısız saatlik manuel iş tasarrufu sağlayacaklardır.