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.
| Alan | Anlamı | Geçerli değer aralığı |
|---|---|---|
| 1. Dakika | Saatin hangi dakikasında çalışacağı | 0-59 |
| 2. Saat | Gü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. Ay | Yı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ğin1,15ayın 1'inci ve 15'inci günlerini ifade eder.-(tire): Bir aralık tanımlar; örneğin9-17saat 9 ile 17 arasındaki tüm saatleri kapsar./(eğik çizgi): Adım (step) değeri tanımlar;*/5ilgili alanda her 5 birimde bir anlamına gelir ve10-40/10gibi 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.
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.
Zamanlamayı seçin, geçerli cron ifadesini otomatik oluşturalım - ham cron sözdizimi bilmenize gerek yok.