Hizmetler Hosting & Sunucu Araçlar Blog Ara Kurumsal EnglishEN
Teklif Alın

Crontab Nedir ve Ne İşe Yarar?

Crontab (cron table), Linux ve Unix tabanlı sistemlerde bir komutu veya betiği önceden tanımlanmış zaman aralıklarında otomatik olarak çalıştırmak için kullanılan bir zamanlayıcı mekanizmasıdır. Sistemde arka planda sürekli çalışan cron daemon'u (çoğu dağıtımda crond), her dakika kullanıcı ve sistem crontab dosyalarını kontrol eder; zamanı gelen bir görev varsa onu çalıştırır. Sunucu yönetiminde crontab, insan müdahalesi olmadan tekrar eden işleri güvenilir şekilde yürütmenin standart yoludur.

Pratikte crontab'a en sık şu amaçlarla ihtiyaç duyulur:

  • Veritabanı ve dosya yedeklerini her gece belirli bir saatte almak
  • Log dosyalarını belirli aralıklarla döndürmek (log rotation) ve eskilerini temizlemek
  • Disk temizliği, geçici dosya silme gibi periyodik bakım betiklerini çalıştırmak
  • Önbelleği (cache) düzenli aralıklarla temizlemek veya yeniden oluşturmak
  • Rapor üretimi, e-posta bildirimi gibi tekrar eden işleri otomatikleştirmek
  • SSL sertifika yenileme kontrolleri gibi periyodik bakım görevlerini tetiklemek

Cron İfadesinin 5 Alanı

Bir cron ifadesi sırasıyla dakika, saat, ayın günü, ay ve haftanın günü olmak üzere 5 alandan oluşur; alanlar boşlukla ayrılır ve sıraları sabittir. Bir görevin ne zaman çalışacağını, bu 5 değerin birlikte tanımladığı zaman deseni belirler.

AlanAnlamıGeçerli değer aralığı
1. DakikaSaatin hangi dakikasında çalışacağı0-59
2. SaatGünün hangi saatinde çalışacağı (24 saat formatı)0-23
3. Ayın günüAyın hangi gününde çalışacağı1-31
4. AyYılın hangi ayında çalışacağı1-12
5. Haftanın günüHaftanın hangi günü/günlerinde çalışacağı (0 Pazar'dır)0-6

Ayın günü ve haftanın günü birlikte kısıtlanırsa ne olur?

Bu, cron'un en sık yanlış anlaşılan davranışıdır. Hem "ayın günü" hem "haftanın günü" alanı aynı anda * değilse, cron bu iki koşulu VE değil VEYA mantığıyla birleştirir: görev, koşullardan biri sağlandığında çalışır, ikisinin birden sağlanması gerekmez. Örneğin 0 0 1,15 * 1 ifadesi "ayın 1'i veya 15'i olan günlerde ya da o gün Pazartesi ise" çalışır — "ayın 1'i veya 15'i olup aynı zamanda Pazartesi olan günlerde" değil. Bu farkı bilmemek, beklenenden çok daha sık tetiklenen görevlere yol açar.

Özel Karakterler: *, , (Virgül), - (Tire) ve / (Eğik Çizgi)

  • * (yıldız): "her değer" anlamına gelir; ilgili alanın olası tüm değerlerini kapsar.
  • , (virgül): Bir liste tanımlar; örneğin 1,15 ayın 1'inci ve 15'inci günlerini ifade eder.
  • - (tire): Bir aralık tanımlar; örneğin 9-17 saat 9 ile 17 arasındaki tüm saatleri kapsar.
  • / (eğik çizgi): Adım (step) değeri tanımlar; */5 ilgili alanda her 5 birimde bir anlamına gelir ve 10-40/10 gibi bir aralıkla birleştirilebilir.

Çoğu Linux dağıtımındaki cron uygulaması ayrıca @daily, @hourly, @weekly, @monthly ve @yearly gibi kısayol ifadeleri de destekler; bunlar sırasıyla 0 0 * * *, 0 * * * *, 0 0 * * 0, 0 0 1 * * ve 0 0 1 1 * karşılığına gelir.

Örneklerle Cron İfadeleri

Aşağıdaki örnekler, yukarıdaki alan ve karakter kurallarının pratikte nasıl bir araya geldiğini gösterir:

# Her 5 dakikada bir çalıştır
*/5 * * * * /usr/local/bin/check-disk.sh

# Her gün saat 03:00'te yedek al
0 3 * * * /usr/local/bin/backup.sh

# Her Pazartesi saat 09:00'da haftalık rapor gönder
0 9 * * 1 /usr/local/bin/weekly-report.sh

# Ayın ilk günü, gece yarısı temizlik betiğini çalıştır
0 0 1 * * /usr/local/bin/monthly-cleanup.sh

# Hafta içi mesai saatlerinde (09-18) her saat başı kontrol et
0 9-18 * * 1-5 /usr/local/bin/business-hours-check.sh

crontab -e, crontab -l ve Sistem Geneli Görevler

Çoğu Linux sunucusunda cron görevleri iki seviyede yönetilir: kullanıcı seviyesindeki crontab dosyaları ve sistem geneli yapılandırma.

crontab -e

Geçerli kullanıcının crontab dosyasını varsayılan metin düzenleyicide açar. Dosya kaydedildiğinde cron daemon değişikliği otomatik olarak algılar; servisi yeniden başlatmaya gerek yoktur.

Örnek: crontab -e

crontab -l

Geçerli kullanıcının tanımlı cron görevlerini, düzenleme yapmadan ekrana listeler.

Örnek: crontab -l

Kullanıcı crontab'larının yanında, sistem yöneticileri görevleri /etc/crontab dosyasına veya /etc/cron.d/ dizinindeki ayrı dosyalara da ekleyebilir. Farkı şudur: kullanıcı crontab'ında komut doğrudan 5 zaman alanından sonra gelir, ancak /etc/crontab ve /etc/cron.d/ dosyalarında zaman alanlarından hemen sonra görevin hangi kullanıcı hesabıyla çalışacağını belirten ek bir alan bulunur. Paket kurulumları (örneğin log rotation veya sertifika yenileme araçları) kendi zamanlanmış görevlerini genellikle bu şekilde sisteme kaydeder.

Çıktı Yönlendirme, Loglama ve Ortam Değişkenleri

cron daemon, görevleri kullanıcının interaktif oturumundan bağımsız, oldukça sınırlı bir ortamda çalıştırır. .bashrc veya .profile gibi dosyalar yüklenmez; bu yüzden terminalde sorunsuz çalışan bir komut, cron altında "command not found" hatası verebilir. Cron'un varsayılan PATH değişkeni genellikle yalnızca /usr/bin:/bin gibi temel dizinleri içerir.

Uyarı
cron görevleri interaktif shell'inizin PATH ve ortam değişkenlerini miras almaz. Betiklerde çağrılan komutların (örneğin bir programlama dili yorumlayıcısı veya veritabanı istemcisi) tam yolunu yazmak ya da crontab dosyasının en üstüne açık bir PATH satırı eklemek gerekir.

Ayrıca cron, bir görevin ürettiği standart çıktıyı (stdout) ve hata çıktısını (stderr) varsayılan olarak yerel posta sistemi (MTA) üzerinden kullanıcıya e-posta olarak göndermeye çalışır. Çoğu sunucuda böyle bir posta yapılandırması bulunmadığından bu iletiler ya hiç ulaşmaz ya da yerel mail kutusunu şişirir. Çıktıyı bir log dosyasına yönlendirmek hem sorunları görünür kılar hem de gereksiz posta trafiğini önler.

# stdout ve stderr'i aynı log dosyasına ekleyerek yönlendir
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# Çıktıyı tamamen yok say (hata ayıklamayı zorlaştırdığı için önerilmez)
*/5 * * * * /usr/local/bin/check.sh > /dev/null 2>&1

Sık Yapılan Hatalar

  • Betiğin, interaktif shell'deki ortam değişkenlerine ve PATH'e sahip olacağını varsaymak; cron minimal bir ortamda çalışır.
  • Betik içinde göreli (relative) dosya yolları kullanmak; cron görevi genellikle kullanıcının alıştığı çalışma dizininden başlamaz, bu yüzden dosya ve komut yollarını mutlak (absolute path) yazmak gerekir.
  • Çıktıyı yönlendirmeyi unutmak; bu hem hataların sessizce kaybolmasına hem de posta kutusunun (mailbox) gereksiz e-postalarla dolmasına yol açar.
  • Haftanın günü alanında 0 ile 7'yi farklı günler sanmak: standart cron uygulamalarında hem 0 hem 7 Pazar gününü ifade eder (1-6 ise Pazartesi'den Cumartesi'ye kadardır); bu karışıklık off-by-one hatalarına yol açar.
  • Ayın günü ve haftanın günü alanlarını aynı anda kısıtlayıp aralarında VE mantığı beklemek — yukarıda açıklanan VEYA davranışını göz ardı etmek.
  • crontab -e ile düzenleme yaptıktan sonra çağrılan betiğin çalıştırılabilir izne (chmod +x) sahip olup olmadığını kontrol etmemek.

Sözdizimini elle yazıp alan sırasında hata yapma riskini almak yerine, zamanlamayı görsel olarak seçip geçerli bir cron ifadesi üretmek daha güvenli bir yoldur. KEYDAL'ın cron oluşturucu aracında sıklığı (her N dakikada bir, günlük, haftanın belirli günleri, ayın belirli günü gibi) seçtiğinizde araç doğru 5 alanlı ifadeyi otomatik oluşturur ve bir sonraki 5 çalışma zamanını gösterir.

WhatsApp