Cron İfadesi Nasıl Yazılır?

Cron ifadesi, bir görevin ne sıklıkla çalışacağını beş alanla tanımlayan kısa bir kod; sözdizimi ilk bakışta kafa karıştırıcı ama mantığı basit.

Özet

Cron ifadesi, bir görevin ne sıklıkla çalışacağını beş alanla tanımlayan kısa bir kod; sözdizimi ilk bakışta kafa karıştırıcı ama mantığı basit.

Adım adım

  1. Beş alanın sırasını ezberle: dakika-saat-ayın günü-ay-haftanın günü; sırayı karıştırmak en sık hata sebebi.
  2. Basit bir örnekle başla, mesela "her gün saat 09:00'da" ifadesini yazmayı dene.
  3. Yazdığın ifadeyi bir doğrulayıcıda test et, aracın sana bir sonraki çalışma zamanlarını göstermesini sağla.
  4. Sunucunun saat diliminin senin beklediğinle aynı olup olmadığını kontrol et; cron genelde sunucu saatine göre çalışır, bu en sık gözden kaçan detay.

Neden önemli?

Yanlış yazılmış bir cron ifadesi hata mesajı vermez; sözdizimi geçerliyse sistem onu sessizce kabul eder ve senin istediğin zaman değil, yazdığın zaman çalıştırır. Bir görev günde bir yerine dakikada bir çalışırsa sunucuyu yorar, hiç çalışmazsa da yedekler alınmadan haftalar geçebilir. O yüzden ifadeyi yazmak kadar, yazdığını doğrulamak da işin parçası.

Sık kullanılan kalıplar

  • Her gün gece yarısı: 0 0 * * *
  • Her saat başı: 0 * * * *
  • Her 10 dakikada bir: */10 * * * *
  • Hafta içi her sabah 08:30: 30 8 * * 1-5
  • Her ayın ilk günü saat 06:00: 0 6 1 * *
  • Her pazar gece 03:00: 0 3 * * 0

Sık yapılan hatalar

  • Dakika alanını yıldız bırakmak. Saati doğru yazıp dakikayı unutursan görev o saat boyunca her dakika çalışır.
  • Ayın 31'ine görev kurmak. 31 çekmeyen aylarda görev o ay hiç çalışmaz; ay sonu işleri için ayın 1'ini tercih etmek daha güvenli.
  • Çok sayıda görevi aynı dakikaya koymak. Hepsi gece 00:00'da başlarsa sunucu aynı anda yüklenir; görevleri birkaç dakika arayla dağıt.
  • Yaz saati uygulanan bir saat diliminde gece 02:00-03:00 arasına görev koymak. Saat ileri veya geri alındığı gece görev atlanabilir ya da iki kez çalışabilir.

Örnek bir senaryo

Bir geliştirici, her gece veritabanı yedeği alan bir görev kurmak istiyor ve 0 2 * * * yazıyor. Ertesi sabah yedeğin saat 05:00'te alındığını görüyor. Sebep, sunucunun UTC saatiyle çalışması. Türkiye saati UTC'nin üç saat ilerisinde olduğu için, gece 02:00'de çalışmasını istiyorsa ifadeyi 0 23 * * * olarak yazması gerekiyor. Bunu düzelttikten sonra ifadeyi bir doğrulayıcıya girip sonraki birkaç çalışma zamanını kontrol ediyor ve görevin çıktısını bir log dosyasına yazdırıyor ki bir sonraki sorunda neyin ne zaman çalıştığını görebilsin.

Ne zaman yardım almalı?

Birden fazla sunucuda çalışan veya birbirine bağlı görevlerin (birinin bitmesini bekleyen) zamanlamasını kuruyorsan, cron tek başına yetersiz kalabilir. Bu durumda bir sistem yöneticisiyle görev zamanlayıcı ya da kuyruk sistemi gibi alternatifleri konuşmak faydalı olur.