Cron İfadesi Oluşturucu ve Açıklayıcı
Cron, Linux'ta zamanlanmış görev çalıştırmanın en yaygın yoludur. Zorluğu, beş alanlı ifadenin ilk bakışta okunmamasıdır: */15 8-18 * * 1-5 ifadesi ne zaman çalışır? Aşağıya ifadenizi yazın; araç ne yaptığını Türkçe anlatsın ve sonraki beş çalışma zamanını göstersin. Hesap tarayıcınızda yapılır, hiçbir şey sunucuya gönderilmez.
Cron ifadesi nasıl okunur?
Cron ifadesi boşlukla ayrılmış beş alandan oluşur ve soldan sağa şu sırayla okunur: dakika, saat, ayın günü, ay, haftanın günü. Her alanda şu söz dizimi kullanılabilir:
| Yazım | Anlamı | Örnek |
|---|---|---|
* |
Her değer | * * * * * her dakika |
5 |
Tek bir değer | 5 * * * * her saatin 5. dakikası |
1,15 |
Liste | 0 8 1,15 * * ayın 1'i ve 15'i 08:00 |
9-17 |
Aralık (uçlar dahil) | 0 9-17 * * * 09:00'dan 17:00'ye her saat başı |
*/10 |
Adım | */10 * * * * on dakikada bir |
10-40/10 |
Aralıkta adım | dakika 10, 20, 30, 40 |
Haftanın günü alanında 0 ve 7 Pazar'dır, 1 Pazartesi'dir. Çoğu cron uygulaması mon, jan gibi kısaltmaları da kabul eder, ama taşınabilirlik için sayı kullanmak daha güvenlidir.
Sık yapılan hatalar
Ayın günü ile haftanın gününü birlikte kullanmak. 0 9 1 * 1 ifadesini "ayın 1'i Pazartesiye denk gelirse 09:00" diye okumak çok yaygın bir yanlıştır. Her ikisi de * değilse cron bunları VEYA ile birleştirir: komut hem ayın 1'inde hem her Pazartesi çalışır. Bu araç da aynı kuralı uygular ve bu durumu açıklamada belirtir. "Ayın ilk Pazartesisi" gibi bir koşul için ifadeyi 0 9 * * 1 yapıp komutun içinde [ $(date +\%d) -le 7 ] gibi bir tarih kontrolü eklemeniz gerekir.
*/N ifadesinin sınırı. */7 dakika alanında 0, 7, 14, … 56 değerlerinde çalışır; ardından saat başında yeniden 0'a döner, yani 56. dakikadan sonra 4 dakika beklenip yeni saatte tekrar çalışır. Eşit aralık istiyorsanız 60'ı bölen değerler (5, 10, 15, 20, 30) kullanın.
Yüzde işaretini kaçırmamak. Crontab içinde komut satırındaki % karakteri yeni satır anlamına gelir; date +%F gibi bir komutu date +\%F yazmanız gerekir.
Ortam farkı. Cron, kabuk profilinizi yüklemez; PATH çok kısadır. Komutta programları tam yolla (/usr/bin/python3) çağırın, çıktıyı bir dosyaya yönlendirin (>> /var/log/gorev.log 2>&1), yoksa görev sessizce başarısız olur.
Saat dilimi ve yaz saati. Cron sunucunun yerel saatini kullanır. Türkiye yaz saati uygulamadığı için bir sorun çıkmaz; ancak sunucu UTC'deyse 0 9 * * * Türkiye saatiyle 12:00 demektir. timedatectl ile sunucunun saat dilimini kontrol edin.
Cron mu, systemd timer mı?
Basit ve tek satırlık zamanlamalar için cron hâlâ en hızlı çözümdür. Ancak kaçırılan çalışmaları telafi etme (cihaz kapalıyken geçen zamanlama), günlük kayıtlarını journalctl ile görme, bağımlılık ve rastgele gecikme gibi ihtiyaçlarınız varsa systemd timer daha uygundur. İkisini ayrıntılı karşılaştırdığımız systemd timer ve cron karşılaştırması rehberine bakın. Zamanlanmış görevin gerçekten çalışıp çalışmadığını izlemek için de servis izleme ve alarm rehberini inceleyebilirsiniz.
Örnekler
*/5 * * * *— her beş dakikada bir (sağlık kontrolü, kuyruk işleme).30 2 * * *— her gece 02:30 (veritabanı yedeği; MariaDB otomatik yedek).0 3 * * 0— her Pazar 03:00 (haftalık uzak kopya; rsync ile uzak yedek).0 9 * * 1-5— hafta içi her gün 09:00 (günlük özet e-postası; Python ile günlük özet e-postası).0 0 1 * *— her ayın ilk günü gece yarısı (aylık raporlar).