Cron job, bir sunucuda belirli zamanlarda kendiliğinden çalışan zamanlanmış görevdir. Adını Unix ve Linux sistemlerindeki zamanlayıcı servis olan cron'dan alır. Gece alınan veritabanı yedeği, her sabah gönderilen rapor e-postası, WordPress'in zamanlanmış yazıları, e-ticaret sitelerinin stok ve kur güncellemeleri, eski dosyaların temizlenmesi gibi işlerin çoğu cron ile çalışır.
Cron işlerinin ortak bir sorunu vardır: çalışmadıklarında kimse fark etmez. Site açık görünür, ama yedek haftalardır alınmıyor ya da faturalar gönderilmiyordur.
Cron ifadesi nasıl okunur?
Bir cron satırı beş zaman alanı ve ç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)
│ │ │ │ │
* * * * * komut
* "her değer" demektir. Virgül liste (1,15), tire aralık (1-5), eğik çizgi adım (*/10) belirtir.
Sık kullanılan örnekler
| İfade | Ne zaman çalışır? |
|---|---|
* * * * * | Her dakika |
*/15 * * * * | Her saatin 0., 15., 30. ve 45. dakikasında |
0 * * * * | Her saat başı |
0 3 * * * | Her gece saat 03:00'te |
30 8 * * 1-5 | Hafta içi her sabah 08:30'da |
0 0 1 * * | Her ayın ilk günü gece yarısı |
0 4 * * 0 | Her pazar saat 04:00'te |
Bir ifadenin ne zaman çalışacağından emin değilseniz, sonraki çalışma zamanlarını gösteren bir cron ifadesi çözümleyicisiyle kontrol edin.
Cron nasıl kurulur?
Linux sunucuda: crontab -e komutu kullanıcının cron listesini açar. Satırı ekleyip kaydettiğinizde cron yeni işi kendiliğinden okur. crontab -l mevcut işleri listeler.
cPanel'de: "Cron İşleri" (Cron Jobs) bölümünden sıklığı seçip komutu yazarsınız. Plesk ve diğer panellerde "Zamanlanmış Görevler" bölümü aynı işi görür.
Örnek bir yedek komutu:
0 3 * * * /usr/bin/php /home/kullanici/yedek.php >> /home/kullanici/yedek.log 2>&1
Komutlarda her zaman tam yol kullanın (php yerine /usr/bin/php); cron, oturum açtığınızdaki ortam değişkenlerini taşımaz.
Cron neden çalışmaz?
- Yol sorunu. Komut ya da betik tam yolla yazılmamıştır; terminalde çalışan komut cron'da "bulunamadı" hatası verir.
- İzin sorunu. Betiğin çalıştırma izni yoktur ya da cron'u çalıştıran kullanıcı dosyaya erişemez.
- Ortam farkı. Cron farklı bir PHP sürümü, farklı bir çalışma dizini ya da eksik ortam değişkenleriyle çalışır.
- Saat dilimi. Sunucu UTC'deyse "03:00" Türkiye saatiyle 06:00 demektir.
- Sessiz hata. Betik çalışır ama bir veritabanı ya da ağ hatası yüzünden yarıda kalır; çıktı hiçbir yere yazılmadığı için kimse görmez.
- Takılma. Betik bitmez, bir sonraki çalışma öncekinin üzerine biner ve sunucu kaynakları tükenir.
- Sunucu değişikliği. Hosting taşındığında cron işleri yeni sunucuya aktarılmamıştır.
WordPress'te WP-Cron
WordPress'in kendi zamanlayıcısı WP-Cron, gerçek bir cron değildir: yalnız biri siteyi ziyaret ettiğinde çalışır. Az ziyaret edilen sitelerde zamanlanmış yazılar gecikir, yoğun sitelerde ise her ziyarette tetiklendiği için gereksiz yük oluşturur. Çözüm, wp-config.php dosyasına define('DISABLE_WP_CRON', true); ekleyip wp-cron.php adresini sunucu cron'u ile düzenli çağırmaktır.
Cron'un çalıştığından nasıl emin olunur?
- Çıktıyı kayda yazın. Komutun sonuna
>> /yol/is.log 2>&1ekleyin; hata da çıktı da dosyaya gider. - Hata durumunda e-posta. Crontab'ın başına
MAILTO=adres@ornek.comyazmak, çıktı üreten işlerin sonucunu e-postayla gönderir. Ancak bu yalnız iş çalışıp çıktı verdiğinde işe yarar; iş hiç çalışmazsa e-posta da gelmez. - Heartbeat (sinyal) izleme. En güvenilir yöntem budur: iş her başarıyla bittiğinde dışarıdaki bir adrese "çalıştım" sinyali gönderir. Sinyal beklenen zamanda gelmezse sorun var demektir. Bu yöntem işin hiç çalışmadığı, yarıda kaldığı ve takıldığı durumların hepsini yakalar.
Heartbeat için komutun sonuna tek satır eklemek yeter:
0 3 * * * /usr/bin/php /home/kullanici/yedek.php && curl -fsS https://sinyal-adresiniz > /dev/null
&& sayesinde sinyal yalnız iş başarıyla biterse gönderilir.
Cron işlerinizi heartbeat ile izleyin
domainizle.tr ile heartbeat izleme, her işiniz için gizli bir sinyal adresi verir. İşin ne sıklıkla çalışması gerektiğini ya da cron ifadesini ve saat dilimini siz seçersiniz. Sinyal gecikirse "gecikti", iş hata kodu bildirirse "hata bildirdi", başlayıp bitmezse "takıldı" uyarısı gelir; iş yeniden çalışınca da haber verilir. Sunucunuza bir şey kurulmaz, adresi bilen yalnız sinyal gönderebilir.
Sık sorulan sorular
Cron job ile cron arasındaki fark nedir?
Cron, zamanlanmış görevleri çalıştıran servistir. Cron job ise bu servise tanımlanmış tek bir görevdir; crontab de bu görevlerin listelendiği dosyadır.
Cron işi terminalde çalışıyor ama cron'da çalışmıyor, neden?
Neredeyse her zaman ortam farkındandır. Cron, oturumunuzdaki PATH değişkenini ve çalışma dizinini kullanmaz. Komutlarda ve betik içindeki dosya yollarında tam yol kullanın, çıktıyı bir kayıt dosyasına yazıp hatayı okuyun.
Paylaşımlı hostingde cron kullanabilir miyim?
Çoğu hosting paketi cPanel ya da Plesk üzerinden cron tanımlamaya izin verir. Bazı paketler en kısa çalışma aralığını sınırlar; paketinizin kurallarını hosting firmanızdan öğrenin.
Cron'un çalışıp çalışmadığını nasıl anlarım?
Çıktıyı bir kayıt dosyasına yazarak geçmiş çalışmaları görebilirsiniz. Ama iş hiç çalışmadığında kayıt da oluşmaz. Bunu yakalamanın yolu, iş bitince dışarıya sinyal gönderen heartbeat izlemedir.
Yedeğinizin alınmadığını ihtiyacınız olduğunda öğrenmeyin. Hesap oluşturun, domaininizi ekleyin ve zamanlanmış işleriniz durduğunda ilk siz haberdar olun.
Bunu her ay elle kontrol etmeyin
domainizle.tr domain ve SSL bitiş tarihlerini kendiliğinden okur, sitenizin açık olup olmadığını düzenli yoklar; süre dolmadan önce kademeli olarak ve site kapandığında haber verir. Kurulum ya da sunucu erişimi gerekmez.
1 ay ücretsiz deneyin Nasıl çalışır