İçeriğe geç

Cron Job Nedir? Crontab Söz Dizimi ve WordPress'te WP-Cron Ayarı

Egemen KEYDAL · İçerik Editörü ve SEO UzmanıYayımlanma: 8 dk okuma

Terminalde crontab dosyasındaki zamanlanmış görev satırları

Cron job, Linux ve Unix tabanlı sunucularda belirli bir komutun veya betiğin önceden tanımlanmış zamanlarda otomatik olarak çalıştırılmasını sağlayan zamanlanmış görevdir. Örneğin "her beş dakikada bir yeni haberleri çek" ya da "her gece saat 03.00'te yedek al" gibi tekrarlayan işler cron job ile yapılır. Görevler, crontab adı verilen bir dosyada tek satırlık kurallar olarak tanımlanır.

Haber sitelerinde birçok iş crona bağlıdır: Ajans haberlerinin düzenli içe aktarılması, zamanlanmış yazıların yayına alınması, site haritalarının güncellenmesi ve önbelleğin temizlenmesi gibi işler çoğunlukla cron'a dayanır. Kurulumun tamamı WordPress haber sitesi rehberinde.

Cron, cron job ve crontab arasındaki fark

Bu üç terim sık sık birbirinin yerine kullanılır ama farklı şeyleri ifade eder:

Terim Anlamı
cron Arka planda sürekli çalışan ve zamanı gelen görevleri tetikleyen sistem hizmeti (daemon)
cron job Belirli bir zamanda çalıştırılacak tek bir görev
crontab Cron job'ların listelendiği tablo/dosya ("cron table") ve bu dosyayı düzenleyen komut

Cron hizmeti her dakika crontab dosyalarını kontrol eder ve zamanı gelen görevleri çalıştırır. Bu nedenle cron ile tanımlanabilecek en kısa aralık bir dakikadır.

Crontab söz dizimi

Bir cron job satırı beş zaman alanı ve ardından çalıştırılacak komuttan oluşur:

┌───────────── dakika (0–59)
│ ┌─────────── saat (0–23)
│ │ ┌───────── ayın günü (1–31)
│ │ │ ┌─────── ay (1–12)
│ │ │ │ ┌───── haftanın günü (0–7; 0 ve 7 = Pazar)
│ │ │ │ │
* * * * *  çalıştırılacak-komut

Alanlarda kullanılabilen özel karakterler:

  • * → "her" anlamına gelir (her dakika, her saat vb.).
  • , → birden fazla değer belirtir (1,15,30).
  • - → aralık belirtir (1-5 = Pazartesi'den Cuma'ya).
  • / → adım belirtir (*/10 = her 10 birimde bir).

Sık kullanılan örnekler

Zamanlama Anlamı
* * * * * Her dakika
*/5 * * * * Her 5 dakikada bir
0 * * * * Her saat başı
0 3 * * * Her gün saat 03.00'te
30 8 * * 1-5 Hafta içi her gün 08.30'da
0 0 1 * * Her ayın 1'inde gece yarısı
0 */6 * * * Her 6 saatte bir

Bazı cron sürümleri @hourly, @daily, @weekly gibi kısaltmaları da destekler. Kullandığınız sunucunun cron sürümünü bilmiyorsanız beş alanlı standart biçimi tercih etmek daha güvenlidir.

Crontab nasıl düzenlenir?

SSH ile sunucuya bağlandıktan sonra kendi kullanıcınızın crontab dosyasını düzenlemek için:

crontab -e     # crontab dosyasını düzenleyicide açar
crontab -l     # mevcut görevleri listeler

Paylaşımlı hostinglerde SSH erişimi olmayabilir. Bu durumda cPanel, Plesk veya benzeri kontrol panellerinde genellikle "Cron Jobs" ya da "Zamanlanmış Görevler" adlı bir menü bulunur; aynı zaman alanlarını form üzerinden doldurursunuz.

Cron görevleri sizin oturumunuzdan farklı, sınırlı bir ortam değişkeni setiyle çalışır. Bu yüzden komutlarda php, curl gibi programların tam yolunu yazmak (ör. /usr/bin/php) hataları azaltır. Sunucunuzdaki yolu which php komutuyla öğrenebilirsiniz.

WP-Cron nedir ve neden yetersiz kalabilir?

WordPress, sunucuya erişimi olmayan kullanıcıların da zamanlanmış görev çalıştırabilmesi için kendi zamanlayıcısını içerir: WP-Cron. Zamanlanmış yazıların yayınlanması, eklenti güncellemelerinin kontrolü ve birçok eklentinin periyodik görevleri WP-Cron üzerinden çalışır.

Ancak WP-Cron gerçek bir cron değildir. WordPress'in resmi geliştirici belgelerinde de belirtildiği gibi, WP-Cron her sayfa yüklemesinde zamanı gelmiş görev olup olmadığını kontrol eder. Yani görevler, siteyi biri ziyaret ettiğinde tetiklenir. Bu yaklaşımın haber siteleri için iki önemli sorunu vardır:

  1. Düşük trafikte gecikme: Gece saatlerinde veya yeni açılmış bir sitede ziyaretçi yoksa, "her 5 dakikada bir" ayarlanmış bir görev saatlerce çalışmayabilir. Ajans haberleri zamanında içe aktarılmaz, zamanlanmış haberler geç yayınlanır.
  2. Yüksek trafikte yük: Çok yoğun trafikte WP-Cron kontrolü sık tetiklenir ve uzun süren görevler sayfa yanıt süresini etkileyebilir.

Bu nedenle haber siteleri ve düzenli içe aktarma yapan siteler için önerilen yöntem, WP-Cron'un sayfa yüklemesiyle tetiklenmesini kapatıp görevleri gerçek sistem cron'u ile düzenli aralıklarla çalıştırmaktır.

WordPress'te sistem cron'u kurulumu (adım adım)

Adım 1: WP-Cron'un sayfa yüklemesiyle çalışmasını kapatın

wp-config.php dosyasında, "That's all, stop editing!" satırının üstüne şu satırı ekleyin:

define( 'DISABLE_WP_CRON', true );

Bu ayar WP-Cron'u tamamen silmez; yalnızca ziyaretlerle tetiklenmesini durdurur. Görevlerin çalışması için bir sonraki adımı mutlaka uygulayın, aksi halde zamanlanmış yazılar ve eklenti görevleri hiç çalışmaz.

Adım 2: Sistem cron'una görev ekleyin

crontab -e ile şu satırlardan birini ekleyin (alan adını kendinizinkiyle değiştirin). Örnek, görevleri her 5 dakikada bir tetikler:

# Seçenek A: curl ile wp-cron.php'yi tetikleme
*/5 * * * * curl -s https://alanadiniz.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

# Seçenek B: wget ile
*/5 * * * * wget -q -O - https://alanadiniz.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

# Seçenek C: WP-CLI ile (sunucuda WP-CLI kuruluysa önerilir)
*/5 * * * * cd /var/www/alanadiniz && /usr/local/bin/wp cron event run --due-now > /dev/null 2>&1

WP-CLI yöntemi HTTP isteği yapmadığı için web sunucusuna yük bindirmez ve zaman aşımı sorunlarından etkilenmez. Yolları kendi sunucunuza göre düzenleyin.

Adım 3: Doğrulayın

  • WP-CLI varsa wp cron event list komutuyla zamanlanmış görevleri ve bir sonraki çalışma zamanlarını görebilirsiniz.
  • Bir test yazısını birkaç dakika sonrasına zamanlayın ve zamanında yayınlanıp yayınlanmadığını kontrol edin.
  • İçe aktarma eklentiniz bir günlük (log) tutuyorsa son çalışma zamanına bakın.

Haber sitelerinde cron ile yapılan tipik işler

Görev Önerilen sıklık Not
Ajans haberlerini içe aktarma 5–15 dakika Ajansın önerdiği istek sınırına uyun
Zamanlanmış yazıları yayınlama 1–5 dakika WP-Cron görevi
Haber site haritasını yenileme Yeni yazıyla birlikte veya 15 dakika Çoğu SEO eklentisi otomatik yapar
Önbellek temizleme / ön ısıtma Duruma göre Manşet değişikliklerinde
Veritabanı ve dosya yedeği Günlük, gece saatlerinde Yedeği farklı bir sunucuya taşıyın
Eski revizyonları temizleme Haftalık Veritabanını hafif tutar

Cron ve YHA entegrasyonu

Yazar Haber Ajansı (YHA) abonelerinin kullandığı YHA WordPress eklentisi, yeni haberleri WP-Cron ile 5 dakikada bir çeker; anlık bildirim açıksa ajans yeni haberde sitenizi dürttüğü için zamanlanmış çekme 15 dakikada bir yedek olarak çalışır. WP-Cron ziyaretle tetiklendiğinden az ziyaret alan sitede bu çekme gecikebilir. DISABLE_WP_CRON tanımlıysa ya da sitenize az ziyaret geliyorsa, yukarıdaki adımlarla sistem cron'u kurmanız içe aktarmanın düzenli çalışmasını sağlar; eklentinin belgesi de wp cron event run --due-now ya da wp-cron.php çağrısıyla çalışan bir sistem cron'u örneği verir. Son başarılı çekme üç aralıktan eskiyse eklenti, yönetim ekranında sarı bir uyarı gösterir.

WordPress kullanmıyorsanız da cron ile entegrasyon mümkündür. Kendi betiğinizle YHA API'sinden belirli aralıklarla haber çekebilir, ajans FTP sunucusundan dosya indirebilir veya RSS beslemesini okuyabilirsiniz. YHA, API akışında yeni içerik kalmadığında bir sonraki isteğin en erken 10 saniye sonra yapılmasını, RSS beslemesinin de dakikada birden sık okunmamasını ister; cron'un bir dakikalık en kısa aralığı bu sınırların içinde kalır. Cron, "çekme" (pull) yaklaşımının temelidir. Haberlerin anında size iletilmesini istiyorsanız, cron yerine YHA'nın webhook desteğiyle "itme" (push) yaklaşımını değerlendirebilirsiniz; bu yöntemde yeni haber yayınlandığında YHA sizin sunucunuza bildirim gönderir. Tüm yöntemleri WordPress'e otomatik haber çekme rehberimizde karşılaştırdık.

Aşağıda, cron ile çalışan basit bir çekme betiği örneği var. Endpoint ve parametreler örnektir; gerçek değerler için YHA geliştirici belgelerine bakın:

# Örnek: her 10 dakikada bir YHA API'den haber çeken PHP betiği
*/10 * * * * /usr/bin/php /home/kullanici/betikler/yha-haber-cek.php >> /home/kullanici/logs/yha-cek.log 2>&1

Çakışan görevleri önleme: kilit kullanımı

Bir içe aktarma görevi her 5 dakikada bir çalışacak şekilde ayarlandıysa ama bir seferinde ajans tarafında yoğunluk olduğu için 7 dakika sürdüyse, ilk görev bitmeden ikincisi başlar. İki görev aynı haberleri aynı anda içeri almaya çalışırsa çift kayıtlar oluşabilir. Bunu önlemenin en basit yolu, Linux'taki flock aracıyla görevi bir kilit dosyasına bağlamaktır. Kilit doluysa yeni görev beklemeden çıkar:

*/5 * * * * /usr/bin/flock -n /tmp/yha-cek.lock /usr/bin/php /home/kullanici/betikler/yha-haber-cek.php

Kilit kullanmanın yanında, içe aktarma betiğinizin haberleri benzersiz bir kimlikle (ajansın verdiği haber kimliği gibi) kontrol etmesi de çift kaydı önlemenin ikinci güvencesidir.

Cron görevlerini izleme

Cron sessiz çalışır; bir görev başarısız olduğunda kimse fark etmeyebilir. Haber siteleri için bu, saatlerce yeni haber düşmemesi demektir. İzleme için şu yöntemleri birlikte kullanın:

  • Log dosyası: Görevin çıktısını tarih damgasıyla bir log dosyasına yazdırın ve dosyanın boyutunu düzenli olarak döndürün (log rotation).
  • E-posta bildirimi: Crontab dosyasının başına MAILTO=eposta@alanadiniz.com satırı eklerseniz, çıktı üreten görevlerin çıktısı bu adrese gönderilir. Sunucunuzda e-posta gönderimi yapılandırılmış olmalıdır.
  • Kalp atışı (heartbeat) kontrolü: Görev her başarılı çalıştığında bir izleme servisine kısa bir istek gönderir; belirli süre istek gelmezse uyarı alırsınız.
  • İçerik kontrolü: En basit yöntem, sitenizdeki son ajans haberinin ne zaman yayınlandığına bakmaktır. Yoğun saatlerde uzun süre yeni haber yoksa sorun vardır. Ajans tarafında bir kesinti olup olmadığını YHA servis durumu sayfasından kontrol edebilirsiniz.

Güvenlik notları

  • API anahtarı veya şifre gibi gizli bilgileri crontab satırına yazmayın; bunları betiğin okuduğu, yalnızca ilgili kullanıcının erişebildiği bir yapılandırma dosyasında veya ortam değişkeninde tutun.
  • Cron görevlerini root yerine sitenin kendi kullanıcısıyla çalıştırın. Böylece bir hata veya güvenlik açığı tüm sunucuyu etkilemez.
  • Betik dosyalarını web kök dizininin (public_html, www) dışında saklayın ki tarayıcıdan doğrudan çalıştırılamasın.

Sık yapılan cron hataları

  • DISABLE_WP_CRON ekleyip sistem cron'unu kurmamak: En yaygın hatadır. Zamanlanmış yazılar ve eklenti görevleri tamamen durur.
  • Göreli yol kullanmak: Cron, komutları sizin çalışma dizininizde çalıştırmaz. Tam yol kullanın.
  • Çıktıyı hiç kaydetmemek: Tüm çıktıyı /dev/null'a yönlendirmek hata ayıklamayı imkânsız hale getirir. Sorun yaşadığınızda çıktıyı bir log dosyasına yönlendirin.
  • Çok sık çalıştırmak: Her dakika ağır bir içe aktarma görevi çalıştırmak hem sunucuyu hem de ajansın API sınırlarını zorlar. Bir görev bitmeden yenisi başlayabilir; uzun görevlerde kilit (lock) mekanizması kullanın.
  • Saat dilimini unutmak: Sunucu saat dilimi UTC olabilir. "03.00" yazdığınızda Türkiye saatiyle 06.00'da çalışabilir. Sunucu saatini date komutuyla kontrol edin.
  • Yüzde işaretini kaçışsız bırakmak: Crontab satırlarında % karakteri özel anlam taşır; date +%Y gibi komutlarda \% olarak yazılmalıdır.

Sıkça Sorulan Sorular

Cron job ile en kısa hangi aralık tanımlanabilir?

Standart cron ile en kısa aralık bir dakikadır. Daha sık çalışma gerekiyorsa betik içinde döngü kurmak veya farklı bir zamanlayıcı kullanmak gerekir; haber içe aktarma için bu genellikle gereksizdir.

Cron job'ımın çalışıp çalışmadığını nasıl anlarım?

Önce crontab -l ile görevin listede olduğunu doğrulayın. Ardından görevin çıktısını bir log dosyasına yönlendirip birkaç çalışma periyodu sonra dosyayı inceleyin. Birçok Linux dağıtımında cron'un kendi kayıtları sistem günlüklerinde (ör. /var/log/syslog veya journalctl) de görülebilir. WordPress tarafında WP-CLI ile wp cron event list komutu, görevlerin bir sonraki çalışma zamanını gösterir; bu zamanlar geçmişte kalıyorsa görevler tetiklenmiyor demektir.

Windows sunucuda cron var mı?

Windows'ta cron yerine "Görev Zamanlayıcı" (Task Scheduler) kullanılır. Mantık aynıdır: belirli zamanlarda bir komut veya betik çalıştırılır.

WP-Cron'u kapatmak sitemi bozar mı?

Yalnızca DISABLE_WP_CRON ekleyip sistem cron'u kurmazsanız zamanlanmış görevler çalışmaz. Sistem cron'unu doğru kurarsanız site eskisinden daha güvenilir çalışır.

Paylaşımlı hostingde sistem cron'u kurabilir miyim?

Çoğu paylaşımlı hosting kontrol panelinde "Cron Jobs" menüsü bulunur. Bazı sağlayıcılar minimum aralığı sınırlayabilir (ör. 15 dakika); bu bilgiyi sağlayıcınızdan öğrenin.

İlgili rehberler