1. Anasayfa
  2. Blog
  3. Nedir

Cron Job Nedir, Nasıl Oluşturulur?

Cron Job Nedir, Nasıl Oluşturulur?

Cron Job, belirli zaman aralıklarında veya periyodik tarihlerde komutların, betiklerin veya yazılımların otomatik olarak yürütülmesini sağlayan bir sistem programıdır. Teknik olarak iki ana bileşenden oluşur: crond (Daemon) ve crontab (Cron Table). İşte detaylar…

Cron Job Nedir? Temel Mimariyi Anlamak

“Cron”, UNIX ve Linux tabanlı işletim sistemlerinde arka planda sessizce çalışan, zaman tabanlı bir görev zamanlayıcıdır (job scheduler). Geliştirilme tarihi 1975 yılına, efsanevi AT&T Bell Laboratuvarları’na kadar uzanan bu sistem, ismini Yunanca “zaman” anlamına gelen Chronos kelimesinden alır. Basitçe ifade etmek gerekirse; sunucunuza “Her gece saat 03:00’te veri tabanımın yedeğini al” veya “Her 15 dakikada bir hava durumu API’sinden güncel verileri çek” dediğiniz mekanizmanın adıdır. Sisteminizde zamanlanmış olarak çalıştırılan bu görevlerin her birine ise Cron Job adı verilir.

Sisteminizde bu işleri organize eden asıl beyin, arka planda sürekli çalışan crond (cron daemon) adlı bir servistir. Bu servis, sistem başlatıldığında devreye girer ve uyku modunda bekler. Her dakikanın başında uyanır ve sistemdeki yapılandırma dosyalarını (crontab dosyalarını) tarar. Eğer o anki sistem saati, sizin tanımladığınız bir görevin çalışma saatiyle eşleşiyorsa, ilgili komutu veya betiği anında çalıştırır.

# Crontab Nedir?

Cron daemon’ının okuduğu ve görevlerin listelendiği tablolara crontab (cron table) adı verilir. İşletim sisteminde iki farklı tür crontab bulunur:

  1. Sistem Genelindeki Crontab (/etc/crontab): Genellikle sadece “root” yetkisine sahip sistem yöneticilerinin düzenleyebildiği, tüm işletim sistemini ilgilendiren görevlerin yer aldığı dosyadır.
  2. Kullanıcı Crontab Dosyaları: Sistemdeki her kullanıcının (örneğin ubuntu, centos veya kendi oluşturduğunuz bir web kullanıcısı) kendine ait izole bir crontab dosyası olabilir. Terminal ekranında crontab -e komutunu yazdığınızda, sizin oturumunuza ait zamanlanmış görevleri düzenlersiniz.

# Cron Sözdizimini (Syntax): “5 Yıldız” Kuralı

Eğer cron ile çalışacaksanız, onun kendine has o meşhur beş yıldızlı sözdizimini (syntax) öğrenmeniz şart. İlk bakışta karmaşık gibi görünse de mantığını kavradığınızda son derece basittir. Bir crontab satırı her zaman beş zaman parametresi ve ardından çalıştırılacak komuttan oluşur.

Sözdizimi Şeması:

*   *   *   *   *  çalıştırılacak_komut
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └─ Haftanın Günü (0 - 7) (0 ve 7 Pazardır)
│ │ │ └─── Ay (1 - 12)
│ │ └───── Ayın Günü (1 - 31)
│ └────── Saat (0 - 23)
└─────── Dakika (0 - 59)

Zamanlamayı sadece sabit sayılarla yapmak zorunda değilsiniz. Cron, size inanılmaz bir esneklik sunan özel operatörlere sahiptir. Aşağıdaki tablo, bu operatörleri en anlaşılır şekilde özetlemektedir:

OperatörİşleviÖrnek SözdizimiNe İfade Eder?
* (Yıldız)Tüm olası değerleri kapsar. “Her” anlamına gelir.* * * * *Her ayın, her gününün, her saatinin, her dakikası çalışır.
, (Virgül)Belirli değerleri listelemek için kullanılır.0 0,12 * * *Görev sadece gece yarısı (00:00) ve öğlen (12:00) çalışır.
- (Tire)Bir aralık (range) belirtir.0 9-17 * * 1-5Hafta içi (Pazartesi-Cuma arası) saat 09:00 ile 17:00 arasında her saat başı çalışır.
/ (Bölü)Atlamalı (step) değerler için kullanılır.*/15 * * * *Görevin her 15 dakikada bir yürütüleceğini belirtir.

Cron Job Örnekleri: Gerçek Hayattan Kullanımlar

Teoriyi öğrendikten sonra en iyi öğrenme yöntemi pratik örnekler görmektir. Aşağıda en yaygın kullanılan cron job örneklerini ve açıklamalarını bulabilirsiniz. Her bir örneği kendi ihtiyaçlarınıza göre uyarlayabilirsiniz.

Cron İfadesiAçıklamaKullanım Alanı
0 2 * * *Her gece saat 02:00’da çalışırVeritabanı yedeği, log temizleme
*/5 * * * *Her 5 dakikada bir çalışırSistem izleme, sağlık kontrolü
0 9 * * 1Her Pazartesi sabah 09:00’daHaftalık rapor gönderimi
30 23 * * 0Her Pazar 23:30’da çalışırHaftalık bakım işlemleri
0 0 1 * *Her ayın ilk günü gece yarısıAylık faturalandırma, arşivleme
0 */4 * * *Her 4 saatte bir çalışırÖnbellek temizleme, senkronizasyon
0 8-18 * * 1-5Hafta içi her saat 08:00-18:00Çalışma saati içi kontroller
15 2 * * 6,0Hafta sonu 02:15’te çalışırHafta sonu özel işlemler

💡 İpucu: Karmaşık bir zamanlama yazmanız gerektiğinde, hata yapmamak adına crontab.guru gibi çevrimiçi simülatör araçlarını kullanmanızı kesinlikle tavsiye ederiz. Bu araçlar, yazdığınız kodu anında insanların okuyabileceği İngilizce metinlere çevirerek doğrulama yapmanızı sağlar.

# Standart Dışı Makrolar (Ön Tanımlı Kısaltmalar)

Modern cron sistemleri (çoğu Linux dağıtımı), kodunuzu daha okunabilir kılmak için bazı kısa yolları destekler. Bunları 5 yıldız yerine doğrudan kullanabilirsiniz:

  • @hourly : Her saat başı çalışır (0 * * * * ile aynı).
  • @daily (veya @midnight): Her gün gece yarısı çalışır (0 0 * * *).
  • @weekly : Haftada bir, Pazar gecesi çalışır.
  • @monthly : Ayın ilk günü gece yarısı çalışır.
  • @yearly (veya @annually): Yılda bir kez, 1 Ocak’ta çalışır.
  • @reboot : Bu en sevdiğimiz makrolardan biridir. Sunucu her yeniden başlatıldığında, sistem açılır açılmaz bir görevi tetiklemek için kullanılır. Geçici dosyaları temizleyen veya başlangıç loglarını bildiren betikler için harikadır.
crontab.guru

Komut Satırı Üzerinden Cron Job Nasıl Ayarlanır?

Eğer bir Linux sunucunuz (Ubuntu, CentOS, Pardus vb.) varsa en profesyonel yöntem terminali kullanmaktır.

  1. Terminal’i Açın: SSH ile sunucunuza bağlanın veya yerel sisteminizde terminal açın. Cron job’ları komut satırından yöneteceksiniz.
  2. Crontab’ı Düzenleyin: crontab -e komutunu çalıştırın. İlk kullanımda editör seçimi isteyebilir. nano başlangıç için en kolaydır.
  3. Job’ı Ekleyin: Açılan editörde yeni bir satıra cron ifadenizi ve komutunuzu yazın. Zamanlama kuralını ve çalıştırılacak script’i belirtin.
  4. Kaydedin: Nano’da Ctrl+O ile kaydedin, Ctrl+X ile çıkın. Değişiklikler otomatik olarak aktif hale gelir, servis restart’a gerek yoktur.

💡 Pratik bir örnek üzerinden gidelim. Diyelim ki her gün saat 23:00’te bir yedekleme scripti çalıştırmak istiyorsunuz:

  1. Terminalde şu komutu yazın: crontab -e
  2. Açılan editörün en altına şu satırı ekleyin:
    0 23 * * * /home/kullanici/yedekleme.sh
  3. Nano kullanıyorsanız: Ctrl+O tuşlarına basıp Enter’a tıklayarak kaydedin, ardından Ctrl+X ile çıkın
  4. Kaydettiğinizi doğrulamak için: crontab -l komutunu çalıştırın ve eklediğiniz satırı görün

💡 Mevcut cron job’larınızı listelemek için crontab -l komutunu kullanabilirsiniz. Tüm cron job’larınızı silmek isterseniz (dikkatli olun!) crontab -r komutunu kullanın. Başka bir kullanıcının crontab’ını düzenlemek için root yetkisiyle crontab -u kullaniciadi -e komutunu kullanabilirsiniz.

Kullanıcı bazlı crontab’ların yanı sıra sistem genelinde cron job’lar da oluşturabilirsiniz. Bunlar şu dizinlerde bulunur:

  • /etc/crontab – Ana sistem crontab dosyası
  • /etc/cron.d/ – Ek cron job dosyaları
  • /etc/cron.daily/ – Günlük çalışacak scriptler
  • /etc/cron.weekly/ – Haftalık scriptler
  • /etc/cron.monthly/ – Aylık scriptler

cPanel Cron Job Oluşturma

Paylaşımlı hosting kullanıyorsanız SSH erişiminiz olmayabilir. Bu durumda cPanel, Plesk veya DirectAdmin gibi kontrol panellerini kullanabilirsiniz. cPanel, dünyadaki en yaygın web hosting yönetim platformlarından biridir. cPanel Cron job eklemek için şu adımları izleyebilirsiniz:

  1. Cpanel’e giriş yapın. Genellikle sayfanın alt kısımlarında yer alan “Gelişmiş” sekmesini bulun ve Cron Jobs (Zamanlanmış Görevler) ikonuna tıklayın. yaptığınızda Cronjobs kısmında cron job oluşturmak için 2 farklı mod görürsünüz:
    • Standart Mod– Özellikle yeni kullanıcılar için önerilir. Bu seçenek gerekli ayarların formdan seçilebilmesini sağladığından işlemin daha hızlı ve basit yapılabilmesini sağlar. Standart mod 12 saatlik biçemi kullanır, böylece kullanıcının istediği zamanı seçmesini kolaylastırır (AM= 0-12, PM= 12-23)
      • Standart Mod ile Cronjob Ekleme: Standart modda kullanıcıdan işlemin yapılacağı zamanı seçmesi, rapor gönderilecek mail adresi ve yapılacak işlemi girmesi istenir. Formun en üstündeki alana işlem gerçekleştiğinde ya da bir hata olustuğunda rapor gelmesi istenen adres girilir. Ardından yapılacak işlemin girilmesi gerekir. Buraya tüm unix komutları girilebilir.Örneğin: Bir klasörün tüm içeriğini silmek için: rm home/kullaniciadi/tmp/* komutu kullanılabilir. Bu komutta da oldugu gibi “*” karakteri cron tarafindan da desteklenmektedir. Bu komut “*” /tmp klasöründeki tüm dosyalari temsil ettiginden /tmp klasörünün tüm içerik silinecektir. Daha sonra işlemin yapılacağı tarih seçilir. Son olarak Kaydet (Save Crontab)‘e tıklanarak işlem tamamlanır.
    • Gelişmiş Mod (UNIX Style) – Gelismis mod UNIX tarzi cronjob eklemeyi destekler.Profesyoneller için önerilen moddur.
      • Gelişmiş Mod ile Cronjob Ekleme: İlk kısma rapor iletilecek mail adresi eklenir. Ardından çalıştırılma zamanı için sırasıyla Dakika, Saat, Ayın günü, Ay ve Haftanın günü yazilir. Son olarak “Command” kısmına çalıştırılması istenilen komut girilerek “Commit Changes” butonuna tıklanır.

⚠️ cPanel belgeleri de açıkça uyarır; önceki cron görevinizin bitmesi için yeterli zamanı tanıdığınızdan emin olun. Örneğin bir veri tabanı optimizasyon betiği 8 dakika sürüyorsa, bunu her 5 dakikada bir çalışacak şekilde ayarlarsanız görevler üst üste biner ve sitenizin çökmesine neden olabilir.

Plesk Panel’de Cron Job Oluşturma

Plesk, özellikle Windows sunucularda da sıkça kullanıldığı için hem Linux hem de Windows tarafında pürüzsüz bir deneyim sunar. Plesk arayüzü, cPanel’e göre biraz daha yapılandırılmış ve kullanıcı dostudur. İşte, Adım adım Plesk’te cron oluşturma:

  1. Plesk kontrol panelinize (genellikle 8443 veya 8880 portu üzerinden) giriş yapın.
  2. Sağ taraftaki menüden veya sitenizin dashboard ekranından “Scheduled Tasks” (Zamanlanmış Görevler) sekmesine tıklayın.
  3. Yeni bir görev eklemek için “Add Task” (Görev Ekle) butonuna basın.
  4. Açılan formda, Plesk size üç farklı görev türü seçeneği sunar. İhtiyacınıza uygun olanı seçmelisiniz:
    • Run a command (Bir Komut Çalıştır): .sh betiklerini veya standart Linux/Windows komutlarını çalıştırmak içindir.
    • Fetch a URL (Bir URL Çek): En sevdiğim özelliktir. Dışarıdaki bir API’yi tetiklemek veya kendi sitenizdeki bir tetikleyici adresi (http://siteniz.com/tetikle.php) çağırmak için doğrudan URL’yi yazarsınız.
    • Run a PHP Script (Bir PHP Betiği Çalıştır): Bu seçenekte klasör ağacı açılır ve sitenizin kök dizininden çalıştırmak istediğiniz .php dosyasını fareyle kolayca seçersiniz. Hangi PHP sürümünün (örneğin PHP 8.1 veya 8.2) kullanılacağını da buradan belirleyebilirsiniz.
  5. Zamanlama: Görevin çalışma zamanını “Cron Style” seçeneğini aktif ederek standart sözdizimi ile yazabilirsiniz.
  6. Kaydet ve Test Et: “OK” butonuna tıklayıp kaydedin. Plesk’in en güzel yanlarından biri, kaydettiğiniz görevin yanındaki “Run Now” butonuna basarak görevin hatasız çalışıp çalışmadığını anında test edebilmenizdir.

WordPress Kullanıcıları İçin: WP-Cron ve Real Cron

İnternetteki web sitelerinin çok büyük bir bölümü WordPress altyapısı kullanıyor. Peki WordPress zamanlanmış yayınları, otomatik yedeklemeleri veya tema/eklenti güncellemelerini arka planda nasıl kontrol ediyor dersiniz? Cevap: WP-Cron (wp-cron.php) adı verilen yerleşik, ancak geleneksel cron’dan oldukça farklı çalışan bir mekanizmayla.

Ekiplerimizle optimize ettiğimiz yüzlerce yüksek trafikli ve düşük trafikli WordPress sitesinde gördüğümüz en büyük performans darboğazlarından biri işte bu sistemdir. Size bu mekanizmanın neden tehlikeli olabileceğini ve nasıl çözüleceğini de anlatalım.

# WP-Cron Nasıl Çalışır ve Neden Yetersizdir?

Standart bir sunucu cron job’ı, yukarıda anlattığımız gibi sunucu saatine bağlıdır. Ancak WordPress’in WP-Cron sistemi sunucu saatine değil, sitenize gelen ziyaretçi trafiğine bağlıdır.

  • Düşük Trafikli Sitelerde Sorun: Sitenizde yarın sabah 09:00’da yayınlanması için bir makale planladınız. Eğer sitenize 09:00 ile 11:00 arasında tek bir ziyaretçi bile girmezse, o makale yayınlanmaz. Çünkü wp-cron’u tetikleyecek bir istek oluşmamıştır. Ziyaretçi saat 11:01’de girdiğinde, WordPress “Aaa, geçmişte kalan bir görevim varmış” der ve makaleyi o an yayınlar.
  • Yüksek Trafikli Sitelerde Sorun (Daha Tehlikelidir): Sitenize dakikada yüzlerce ziyaretçi geliyorsa, WordPress her sayfa yüklenmesinde wp-cron.php dosyasını kontrol etmeye çalışır. Bu durum, sunucu CPU ve RAM’i inanılmaz derecede tüketir, sayfa yükleme sürelerinizi saniyelerce uzatır ve “503 Service Unavailable” hatalarına neden olabilir.

Çözüm: WP-Cron’u Devre Dışı Bırakıp “Gerçek Cron” (Real Cron) Kullanmak: Sunucu optimizasyonu alanındaki uzman tavsiyemiz, varsayılan WP-Cron davranışını derhal kapatmanız ve kontrolü işletim sisteminin kendisine, yani gerçek bir Cron Job’a vermenizdir. Bunu iki basit adımda yapabilirsiniz:

  • Adım 1: WP-Cron’u Kapatın: Sitenizin ana dizinindeki (genellikle public_html içindeki) wp-config.php dosyasını bir metin editörüyle açın. En alt kısımlarda yer alan “That’s all, stop editing! Happy blogging.” (Hepsi bu kadar, düzenlemeyi bırakın!) satırından hemen öncesine şu kodu ekleyin ve kaydedin:
define('DISABLE_WP_CRON', true);

Bu kod, WP-Cron’un ziyaretçi geldiğinde tetiklenmesini engeller. Ancak görevleri silmez, sadece beklemeye alır.

  • Adım 2: Sunucudan Gerçek Cron Tetikleyicisi Ekleyin: Şimdi cPanel veya Plesk üzerinden bir zamanlanmış görev oluşturun. Amacımız, sunucunun her 5 dakikada (veya sitenizin yoğunluğuna göre her 15 dakikada) bir, bizim yerimize wp-cron dosyasını arka planda, ziyaretçilere hissettirmeden tetiklemesidir. Bunun için cPanel komut satırına şu kodu eklemeniz yeterli (sitenizin adresini kendi domaininizle değiştirmeyi unutmayın):
wget -q -O - https://sitenizinadi.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Bu yapılandırma sayesinde ziyaretçileriniz hızlı bir sayfa deneyimi yaşarken, zamanlanmış yayınlarınız, e-posta gönderimleriniz ve yedeklemeleriniz saat gibi tıkır tıkır işleyecektir. İşlemleri detaylıca görmek ve yönetmek isterseniz WordPress panelinize “WP Crontrol” adlı ücretsiz eklentiyi kurmanızı da şiddetle öneririz.

Modern Yazılım Mimarileri: Laravel Task Scheduling vs Cron Job

Web teknolojileri geliştikçe, sunucu yönetimi de farklı boyutlara taşınıyor. PHP tabanlı projelerde bugün endüstri standardı haline gelen Laravel framework’ü, geleneksel cron yaklaşımını tamamen değiştiren muazzam bir “Görev Zamanlayıcısı” (Task Scheduling) sunar.

Geleneksel mimaride, projenizde yer alan 10 farklı görev için crontab dosyanıza 10 farklı satır eklemeniz gerekirdi. Bu durum, projeyi başka bir sunucuya taşıdığınızda tüm yapılandırmanın silinmesine (persistance sorunu) veya versiyon kontrol (Git) sistemleri dışında kalmasına neden olurdu.

Laravel’in “Tek Entry (Girdi)” Felsefesi: Sistem uzmanlarının “Neden dev şirketler geleneksel cron kullanmayı bırakıyor?” sorusuna verdiği cevap budur. Laravel, tüm zamanlanmış görevleri sunucu tarafında değil, kod tarafında, genellikle app/Console/Kernel.php içerisinde tanımlamanızı sağlar.

Sunucunuzun crontab dosyasına yalnızca tek bir tetikleyici eklemeniz yeterlidir:

* * * * cd /projenizin/bulundugu/dizin && php artisan schedule:run >> /dev/null 2>&1

Bu komut, Laravel zamanlayıcısını her dakika uyarır. Laravel, kendi iç kodlarında yazan kurallara bakar; “Şu an saat 03:00 mü? Evet, o zaman faturalama fonksiyonunu çalıştır”, “Şu an pazar gecesi mi? Hayır, o zaman e-posta gönderimini pas geç” şeklinde mantıksal bir süzgeçten geçirir.

Görev Kuyrukları (Queue Systems) ile Entegrasyon: Ağır işleri (örneğin binlerce kayıtlık bir veritabanı yedeği veya video dönüştürme işlemi) doğrudan cron üzerinde senkron olarak çalıştırmak sunucuyu kilitler. Modern Laravel uygulamalarında, zamanlayıcı sadece “git ve bu işi kuyruğa at” komutunu verir. Redis veya RabbitMQ gibi veri yapılarına atılan bu işler, arka planda çalışan “Worker” süreçleri tarafından küçük parçalar halinde sunucuyu yormadan eritilir. Bu sayede bir görev hata verirse, sistem çökmez; işçi görevi tekrar denemek (retry) üzere kuyruğun sonuna atar. Uygulamanızı ileride büyütmek ve ölçeklendirmek isterseniz bu MVC tabanlı mimari hayati önem taşır.

Gelişmiş Cron Yapılandırmaları: Sorun Giderme ve Güvenlik

Burası rehberimizin teknik derinliğinin arttığı, ancak sunucu yönetiminde hayatınızı kurtaracak detayların yer aldığı bölümdür. “Betik terminalde çalışıyor ama cron’a ekleyince çalışmıyor” şikayetiyle mutlaka karşılaşmışsınızdır veya karşılaşacaksınız. İşte bunun nedeni ve çözümü:

Kendi bilgisayarınızda veya sunucuya SSH ile bağlanıp bir komutu (örneğin node script.js veya python3 yedek.py) yazdığınızda çalışır. Ancak aynı kodu cron içine koyduğunuzda “Command not found” (Komut bulunamadı) hatası alırsınız. Neden mi?

Çünkü cron daemon, sizin profil dosyalarınızı (~/.bashrc, ~/.profile) yüklemez. İnanılmaz derecede kısıtlı ve güvenli bir ortam oluşturur. Varsayılan olarak kabuk (shell) olarak bash değil sh kullanır ve işletim sisteminde komutları aradığı yol değişkeni (PATH) yalnızca /usr/bin:/bin ile sınırlıdır. Sizin sonradan yüklediğiniz npm, python, custom betikler genellikle /usr/local/bin veya farklı dizinlerde olduğu için cron bunları bulamaz.

Çözüm Yolları:

  • Mutlak Yol (Absolute Path) Kullanmak: En basit ve en temiz çözümdür. python3 script.py yazmak yerine her zaman tam yolu belirtin: /usr/local/bin/python3 /home/user/script.py
  • Crontab İçinde Değişken Tanımlamak: Crontab dosyanızın en üstüne (görevlerden önce) aşağıdaki ortam değişkenlerini ekleyebilirsiniz. Bu sayede alttaki görevler, gelişmiş kabuğu, eksiksiz PATH dizinlerini ve dış veritabanı bağlantılarını doğrudan tanıyacaktır:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@sirketiniz.com
DATABASE_URL=postgresql://localhost/mydb
0 2 * * * /usr/local/bin/yedekleme.sh
  • Profil Dosyasını Source Etmek: Görevinizi bir betik dosyası (.sh) içine yazıyorsanız, betiğin ilk satırlarına source ~/.bashrc veya source /etc/myapp/cron-env ekleyerek sistemdeki tüm ortam değişkenlerini cron oturumuna zorla dahil edebilirsiniz.

# Loglama ve Hata Ayıklama

Cron daemon, standart yapılandırmasında ürettiği ekran çıktılarını veya hataları bir metin dosyasına yazmaz. İşlemin başlayıp başlamadığını /var/log/cron dosyasında görebilirsiniz ancak kodunuz hata verdiyse bunu bilemezsiniz. Bu yüzden tüm çıktıları (Standart Çıktı – STDOUT ve Standart Hata – STDERR) bir log dosyasına yönlendirmelisiniz.

  • Sadece en son çıktıyı tutmak ve eskisini silmek için tek büyüktür işareti (>) kullanılır.
  • Tüm işlem geçmişini satır satır alta eklemek için çift büyüktür işareti (>>) kullanılır.

Unix mimarisinde normal mesajlar kanal 1, hatalar ise kanal 2 (STDERR) üzerinden iletilir. İkisini de aynı log dosyasında toplamak için komutun sonuna 2>&1 eklemelisiniz.

Doğru Loglama Kullanımı:

*/5 * * * * /usr/bin/php /path/foo.php >> /var/log/foo-cron.log 2>&1

İnternetteki bazı kaynaklarda &> şeklinde pratik bir kullanım görebilirsiniz. Ancak bu yalnızca Bash kabuğuna özgüdür. Cron varsayılan olarak sh kabuğu kullandığı için &> kullanırsanız log dosyanız oluşur ama içi tamamen boş (0 byte) kalır. Bir sistem yöneticisi olarak bu “boş günlük dosyası” hatası yüzünden saatlerimi harcadığımı bilirim. Daima POSIX standartlarına uygun olan >> dosya.log 2>&1 yapısını tercih edin.

# Cron Güvenliği: Erişim Denetimi

Sunucu güvenliğiniz, en zayıf halkanız kadar güçlüdür. Sunucunuzda yetkisi sınırlandırılmış bir kullanıcının bile kendi crontab -e dosyasını oluşturarak zararlı bir betiği sürekli tetiklemesi, sunucuda kalıcılık (persistence) sağlamasına neden olabilir.

İşletim sisteminizde kimlerin cron kullanabileceğini yönetmek için /etc/ dizini altında iki kritik dosya bulunur: cron.allow ve cron.deny. Bu dosyaların içine her satıra bir tane gelecek şekilde kullanıcı isimleri yazılır.

Çalışma Mantığı:

  1. Sistem önce /etc/cron.allow dosyasının var olup olmadığına bakar. Eğer bu dosya varsa, sadece bu dosyadaki kullanıcılar cron kullanabilir. Diğer herkes reddedilir (cron.deny dosyası tamamen yok sayılır)
  2. cron.allow yok ama /etc/cron.deny varsa; listedeki kişiler hariç herkes cron kullanabilir
  3. İkisi de yoksa, işletim sisteminin varsayılan kuralları geçerlidir (Örneğin Ubuntu’da herkes kullanabilirken, güvenliği sıkılaştırılmış bazı sunucularda sadece yetkili root hesabı kullanabilir).

📌 Kurumsal güvenlik standartları (Zero-Trust) gereği, daima bir /etc/cron.allow dosyası oluşturup içine yalnızca güvenilir servis kullanıcılarını (ve tabii ki sistemi kitlememek için root kullanıcısını) eklemeniz en iyi güvenlik uygulaması olarak kabul edilir.

# Küresel Sunucular İçin Saat Dilimi Çözümü

Cloud ortamında, sunucularınızın Amerika’da (UTC veya EST), sizin ise Türkiye’de (CET/GMT+3) olmanız çok olağandır. Sistemin her zaman UTC’de tutulması iyi bir standarttır. Peki siz görevinizin Türkiye saatiyle tam sabah 09:00’da çalışmasını nasıl sağlayacaksınız?

Sunucu saatini bozmadan crontab dosyasının başına CRON_TZ (veya bazı sistemlerde sadece TZ) değişkenini ekleyerek spesifik görevleri yerel saate göre eğitebilirsiniz.

CRON_TZ="Europe/Istanbul"
0 9 * * * /scripts/gunluk_bulten.sh

Sessiz Hatalardan Kurtulma: Monitoring Araçları

Bir görevin hata vererek kapanması kötü bir şeydir. Ancak bir görevin hiç çalışmaması ve sistemin size hiçbir uyarı vermemesi çok daha kötü bir şeydir. Buna sektörde “sessiz hata” diyoruz. Örneğin müşteri kredi kartı yenileme cronunuzun günlerce çalışmadığını, ancak finans ekibi size “Neden gelirimiz düştü?” diye sorduğunda fark ederseniz büyük bir krizle karşı karşıyasınız demektir.

Basit e-posta uyarıları (MAILTO) profesyonel geliştiriciler için yetersizdir. Görevlerinizi 7/24 denetleyen özel “Monitoring” araçları kullanmak bir lüks değil, zorunluluktur.

  1. Cronitor: Doğrudan cron monitoring için yaratılmış, çok popüler bir platformdur. Cron job’ınızın sonuna küçük bir API ping kodu eklersiniz. Eğer cron zamanında ping atmazsa veya normalden çok uzun sürerse, sistem çöktü varsayarak size anında SMS veya Slack bildirimi atar
  2. Better Stack: Sadece uptime değil, aynı zamanda “heartbeat” monitörü olarak da çalışır. Zamanlanmış görevleri, SSL sertifikalarınızı ve web yayınlarınızı tek bir panelde izleyip, sorun halinde ekiplere telefon araması bile gerçekleştirebilir.
  3. Prometheus + Grafana: Daha kompleks ve “Kubernetes-native” bulut altyapılarında ekiplerin açık ara favorisidir. Sistem metriklerini (görev başarım oranları, süreleri) toplar ve muazzam görsel panellere dönüştürür.

Editör Notu: İçeriğimiz okuyucu desteğiyle finanse edilmektedir. Bu, bağlantılarımızdan bazılarına tıkladığınızda komisyon kazanabileceğimiz anlamına gelir.

Burada sadece teorik bilgiler değil, gerçek deneyimlere dayanan pratik çözümler var. Burada yol arkadaşı olacağız. Karmaşık konuları birlikte çözecek, teknik detayları birlikte aşacağız...

Yazarın Profili

Yorumlar (6)

  1. Zamanlama kısmına doğru gibi görünen bir ifade yazmama rağmen görev çalışmıyor. Özellikle “her ayın ilk Pazartesi günü” gibi biraz karmaşık ifadeleri nasıl yazmam gerektiğini tam olarak kestiremiyorum. Bu tür özel tarihsel koşullarda en doğru cron ifadesi nasıl oluşturulur? Ayrıca yanlış yazılmış zamanlamaları test etmenin pratik bir yolu var mı?

    • Cron job’ların en çok kafa karıştıran kısmı zamanlama formatlarıdır. Ayın ilk Pazartesi günü gibi özel bir koşul için standart cron ifadeleri yetersiz kalabilir. Bunun için şu şekilde bir çözüm önerilebilir: 0 0 * * 1 [ "$(date +\%m)" -eq "$(date -d "$(date +\%Y-\%m-01) +$(( (8 - $(date -d "$(date +\%Y-\%m-01)" +\%u) ) % 7 )) days" +\%m)" ] && /path/to/command
      Bu karmaşık görünse de, ayın ilk Pazartesi günü olup olmadığını kontrol eden bir bash kontrolüdür.

      Zamanlama ifadelerini test etmek için https://crontab.guru/ gibi siteler oldukça kullanışlıdır. Buraya ifadenizi girerek hangi günlerde çalışacağını görselleştirebilirsiniz. Ayrıca echo “cron ifadeniz” | crontab -l ile crontab’ınıza yazmadan önce komutunuzu test dosyasına eklemeniz de iyi bir alışkanlık olacaktır.

  2. Ben çoğunlukla cPanel veya Plesk panel üzerinden cron job oluşturuyorum ama bazen komutlar tam çalışmıyor. Web uygulamalarında özellikle PHP dosyalarını tetiklerken doğru yolu ve PHP sürümünü belirtmek zor olabiliyor. Panele özgü cron job ayarlarında dikkat etmemiz gereken püf noktalar neler olabilir?

    • Web hosting panellerinde cron job ayarlamak genellikle kolay görünse de, bazı ince detaylar büyük fark yaratır:

      Mutlak Yol Kullanın: php script.php yerine /usr/local/bin/php /home/kullanici/public_html/cron/script.php gibi tam yollar kullanın.
      PHP Sürümünü Belirtin: Sunucunuzda birden fazla PHP sürümü varsa, doğru sürümün yolunu öğrenip kullanmanız gerekir. Örneğin: /opt/cpanel/ea-php82/root/usr/bin/php /home/kullanici/public_html/cron/task.php
      — Dosya İzinleri: Cron job çalışmazsa, script.php dosyasının çalıştırılabilir (chmod 755) olduğundan emin olun.
      — Ayrıca panelde her cron job için e-posta bildirimi kısmını pasifleştirmediyseniz, e-posta kutunuz dolabilir. Komutun sonuna > /dev/null 2>&1 ekleyerek gereksiz çıktıları bastırabilirsiniz.

  3. Cron job’lar sabit zamanlamalara göre çalışıyor. Ancak ben örneğin sadece CPU kullanımı ‘un altındaysa ya da bir dosya varsa çalışacak bir cron job oluşturmak istiyorum. Zamanlamanın dışında koşullara bağlı cron job yapmak mümkün mü? Varsa örnek verebilir misiniz?

    • Çok güzel ve ileri düzey bir kullanım örneği! Evet, cron doğrudan bu tür koşulları desteklemez ama komutun içine koşul yerleştirerek bu yapılabilir.

      — Örneğin CPU kullanımı kontrolü: */5 * * * * [ $(uptime | awk -F'load average:' '{ print $2 }' | cut -d',' -f1 | awk '{print int($1)}') -lt 3 ] && /path/to/script.sh

      — Veya bir dosyanın varlığına göre: */10 * * * * [ -f /tmp/dosya_mevcut.txt ] && /path/to/script.sh

      Daha esnek bir yapı gerekiyorsa cron yerine systemd timer veya inotify gibi sistem araçları da tercih edilebilir. Ama cron içinde koşullu komutlar yazarak çok işlevsel sonuçlar elde edebilirsiniz.