Linux'ta tekrarlayan görevleri otomatikleştirmek için cron kullanılır. Yedekleme, log temizleme, rapor oluşturma gibi işleri manuel yapmak yerine cron ile zamanlayabilirsiniz. Cron Nedir?
Cron, Unix ve Linux sistemlerinde zamanlanmış görevleri çalıştıran daemon'dur. Arka planda sürekli çalışır ve belirlediğiniz zamanlarda komutları veya scriptleri otomatik olarak çalıştırır.
Cron'un çalışma mantığı basittir: Her dakika uyanır, crontab dosyalarını kontrol eder ve o an çalışması gereken görevleri başlatır.
Crontab Dosyaları
Her kullanıcının kendi crontab dosyası vardır:
crontab -e # Düzenle crontab -l # Listele crontab -r # Sil crontab -ri # Onay ile sil
Sistem genelinde crontab dosyası /etc/crontab konumundadır. Root yetkisi gerektirir.
Crontab Söz Dizimi
Crontab'ın beş zaman alanı vardır:
┌──────── 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
Özel Karakterler
Yıldız (): Tüm değerler Virgül (,): Liste (1,3,5 = 1, 3 ve 5) Tire (-): Aralık (1-5 = 1'den 5'e) Bölü (/): Adım (/5 = her 5 birimde)
Pratik Örnekler
Her dakika:
- /path/to/script.sh
Her saat başı:
0 /path/to/script.sh
Her gün gece yarısı:
0 0 * /path/to/script.sh
Her gün sabah 6:30'da:
30 6 * /path/to/script.sh
Hafta içi her gün saat 9'da:
0 9 1-5 /path/to/script.sh
Her 15 dakikada:
/15 * /path/to/script.sh
Her ayın 1'inde saat 3'te:
0 3 1 /path/to/script.sh
Her Pazartesi ve Cuma saat 18'de:
0 18 1,5 /path/to/script.sh
Özel Zaman Dizileri
Cron okunabilirliği artıran kısayollar sunar:
@reboot # Sistem başlangıcında @hourly # Her saat (0 ) @daily # Her gün gece yarısı (0 0 ) @weekly # Her hafta Pazar (0 0 0) @monthly # Her ayın 1'i (0 0 1 ) @yearly # Her yıl 1 Ocak (0 0 1 1 )
Örnek:
@daily /home/kullanici/yedekleme.sh @reboot /home/kullanici/baslangic.sh
Çıktı Yönetimi
Cron varsayılan olarak çıktıyı e-posta ile gönderir. Bunu yönetmek için:
Log dosyasına yönlendirme:
0 2 * /path/to/script.sh >> /var/log/cron.log 2>&1
Çıktıyı sessizce atma:
0 2 * /path/to/script.sh > /dev/null 2>&1
Sadece hataları loglama:
0 2 * /path/to/script.sh > /dev/null 2>> /var/log/cron-errors.log
Çevre Değişkenleri
Cron minimal bir ortamda çalışır. PATH ve diğer değişkenler tanımlı olmayabilir.
Crontab'ın başında tanımlayın:
SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin [email protected]
# Görevler buraya 0 2 * /home/kullanici/yedekleme.sh
Veya script içinde tanımlayın:
#!/bin/bash source /etc/profile source ~/.bashrc
Script komutları
Mutlak yol kullanın:
0 2 * /usr/bin/python3 /home/kullanici/script.py
Pratik Örnekler
Günlük Yedekleme
0 2 * /usr/bin/rsync -avz /home/data /backup/$(date +\%Y\%m\%d) >> /var/log/backup.log 2>&1
Cron'da % karakteri özel anlam taşır. Escape etmek için \% kullanın.
Log Temizleme
0 3 find /var/log -name ".log" -mtime +30 -delete
Disk Uyarısı
/30 * df -h | awk '$5 > 80 {print}' | mail -s "Disk Uyarısı" [email protected]
Veritabanı Yedeği
0 4 * mysqldump -u root -pSIFRE veritabani | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz
Sistem Crontab
/etc/crontab sistem geneli cron görevleri içerir. Ek olarak kullanıcı alanı vardır:
# m h dom mon dow user command 0 5 * root /usr/local/bin/cleanup.sh
Dizin Tabanlı Cron
Sistem cron dizinleri:
/etc/cron.hourly/ # Saatlik /etc/cron.daily/ # Günlük /etc/cron.weekly/ # Haftalık /etc/cron.monthly/ # Aylık
Bu dizinlere çalıştırılabilir script koyun:
sudo cp yedekleme.sh /etc/cron.daily/ sudo chmod +x /etc/cron.daily/yedekleme.sh
Anacron
Cron, sistem kapalıyken zamanlanmış görevleri kaçırır. Anacron bu sorunu çözer.
Anacron, sistem açıldığında kaçırılan görevleri çalıştırır. Dizüstü bilgisayarlar ve sürekli açık olmayan sistemler için idealdir.
/etc/anacrontab:
# period delay identifier command 1 5 daily run-parts /etc/cron.daily 7 10 weekly run-parts /etc/cron.weekly @monthly 15 monthly run-parts /etc/cron.monthly
Systemd Timer Alternatifi
Modern sistemlerde systemd timer'ları cron'a alternatif sunar.
Timer dosyası (/etc/systemd/system/yedekleme.timer):
[Unit] Description=Günlük Yedekleme Timer
[Timer] OnCalendar=daily Persistent=true
[Install] WantedBy=timers.target
Servis dosyası (/etc/systemd/system/yedekleme.service):
[Unit] Description=Yedekleme Servisi
[Service] Type=oneshot ExecStart=/home/kullanici/yedekleme.sh
Etkinleştirme:
sudo systemctl enable --now yedekleme.timer
Timer listesi:
systemctl list-timers
Cron vs Systemd Timer
Cron avantajları:
- Basit söz dizimi
- Yaygın bilinen format
- Tüm sistemlerde mevcut
Systemd timer avantajları:
- Kaçırılan görevleri çalıştırır (Persistent=true)
- Journald ile entegre loglama
- Bağımlılık yönetimi
- Boot sonrası gecikme desteği
Sorun Giderme
Cron çalışmıyor mu?
Servis durumu kontrol:
systemctl status cron # veya systemctl status crond
Log kontrol:
grep CRON /var/log/syslog journalctl -u cron
İzin kontrolü:
ls -la /path/to/script.sh chmod +x /path/to/script.sh
Manuel test:
bash -x /path/to/script.sh
Yaygın Hatalar
PATH sorunu: Script içinde komutların tam yolunu kullanın veya PATH tanımlayın.
İzin sorunu: Script çalıştırılabilir olmalı (chmod +x).
% karakteri: Cron'da özel anlam taşır, \% ile escape edin.
Çevre değişkenleri: Cron minimal ortamda çalışır, gerekli değişkenleri tanımlayın.
Güvenlik Notları
/etc/cron.allow: Sadece listelenen kullanıcılar cron kullanabilir. /etc/cron.deny: Listelenen kullanıcılar cron kullanamaz.
İkisi de yoksa, dağıtıma göre davranış değişir. Genellikle sadece root kullanabilir.
Cron görevlerinde parola saklamayın. Çevre değişkeni veya güvenli dosya kullanın.
İpuçları
Syntax doğrulama: crontab.guru sitesini kullanın.
Test edin: Script'i manuel çalıştırıp test edin.
Loglayın: Her görev için log dosyası tutun.
Kilitleme: Uzun süren görevler için flock kullanın:
0 /usr/bin/flock -n /tmp/script.lock /path/to/script.sh
E-posta: MAILTO değişkeni ile hata bildirimi alın.
Henüz yorum yok.
Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.