Cron ile zamanlanmış görevler: yazım kuralları ve sık yapılan hatalar
Yedek almak, rapor üretmek, eski dosyaları temizlemek... Linux'ta düzenli işlerin çoğu cron ile yapılır. Yazımı basit ama küçük ayrıntılar görevlerin sessizce çalışmamasına yol açabiliyor.
Söz dizimi
┌──────── 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
Örnekler
*/10 * * * * her 10 dakikada bir
0 3 * * * her gün 03:00'te
30 2 * * 0 her pazar 02:30'da
0 9 1 * * her ayın 1'inde 09:00'da
0 8-18 * * 1-5 hafta içi 08:00-18:00 arası saat başı
Düzenlemek için crontab -e, listelemek için crontab -l kullan. Bir ifadenin ne zaman çalışacağından emin değilsen crontab.guru gibi bir araçla kontrol et.
Sık yapılan hatalar
1. PATH farkı
Cron, senin terminalindeki ortam değişkenleriyle çalışmaz; PATH çok kısadır. Terminalde çalışan komut cron'da "command not found" verebilir. Çözüm: tam yol kullan.
0 3 * * * /usr/bin/php /var/www/uygulama/bin/console app:temizle
Komutun tam yolunu which php ile öğrenebilirsin.
2. Çıktının kaybolması
Cron çıktıyı ya yerel posta kutusuna atar ya da kaybeder. Hata ayıklayabilmek için logla:
0 3 * * * /usr/local/bin/yedek.sh >> /var/log/yedek.log 2>&1
2>&1 hata çıktısını da aynı dosyaya yazar.
3. Yüzde işareti
Crontab satırında % karakteri satır sonu anlamına gelir. date +%F gibi bir komut kullanıyorsan \% ile kaçır ya da komutu bir betik dosyasına taşı.
4. Çalışma dizini
Cron görevleri kullanıcının ev dizininde başlar. Betik göreli yol kullanıyorsa önce cd yap ya da betiğin içinde tam yol kullan.
5. Üst üste binen görevler
Her 5 dakikada çalışan bir iş bazen 5 dakikadan uzun sürerse ikinci kopya başlar. flock ile bunu önleyebilirsin:
*/5 * * * * flock -n /tmp/is.lock /usr/local/bin/is.sh
6. Saat dilimi
Cron sunucunun saat dilimini kullanır. timedatectl ile kontrol et; sunucu UTC'deyse Türkiye saatine göre 3 saat geri hesaplaman gerekir.
Çalıştı mı?
grep CRON /var/log/syslog # Debian/Ubuntu
journalctl -u cron --since today # systemd kullanan sistemler
Önemli görevlerde başarısızlık durumunda e-posta veya mesaj gönderen küçük bir kontrol eklemek, sorunu haftalar sonra fark etmekten iyidir.