Linux Cron Job Rehberi: Zamanlanmış Görevler

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...

Linux
Linux Cron Job Rehberi: Zamanlanmış Görevler

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.

Celil Uyanikoglu

Yazan Celil Uyanikoglu

25 yıldır bilgi işlem piyasasında farklı dallarda uzmanlaşan bir Bilgisayar Mühendisi

Yorum

Henüz yorum yok.

Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.

Yorum yap

E-posta adresin yayınlanmaz. Yorumlar moderasyondan sonra yayınlanır.

Sırada

İlgili notlar