crontab

cron, Unix benzeri işletim sistemlerinde belirli komutları veya betikleri (script) düzenli aralıklarla otomatik olarak çalıştırmak için kullanılan standart bir zamanlama daemon'ıdır (arka plan süreci). Çalıştırılacak görevler crontab (cron table) adı verilen dosyalarda tanımlanır.

Crontab Dosyaları

Cron görevleri birkaç farklı yerde tanımlanabilir:

  1. Kullanıcı Crontab'ları: Her kullanıcının kendi zamanlanmış görevlerini tanımlayabileceği özel bir crontab dosyası vardır. Bu dosyalar genellikle /var/spool/cron/crontabs/ (veya benzeri bir dizinde) saklanır ancak doğrudan düzenlenmezler. Kullanıcılar kendi crontab'larını yönetmek için crontab komutunu kullanır. Bu crontab'daki komutlar, o kullanıcının yetkileriyle çalışır.

  2. Sistem Geneli Crontab (/etc/crontab): Bu dosya, sistem genelindeki görevleri tanımlar. Kullanıcı crontab'larından farklı olarak, bu dosyada her satırda komutun hangi kullanıcı olarak çalıştırılacağı belirtilmelidir.

  3. /etc/cron.d/ Dizini: Sistem yöneticileri veya paketler, zamanlanmış görev tanımlarını bu dizine ayrı dosyalar halinde koyabilirler. Bu dosyalardaki format genellikle /etc/crontab ile aynıdır (kullanıcı belirtilmesi gerekir).

  4. Ön Tanımlı Zaman Aralıkları Dizini: /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ dizinlerine yerleştirilen çalıştırılabilir betikler, isimlerine uygun aralıklarla (run-parts komutu aracılığıyla, genellikle /etc/crontab içinden tetiklenerek) otomatik olarak çalıştırılır.

Crontab Satır Formatı

Bir crontab dosyasındaki (kullanıcı crontab'ı veya /etc/crontab, /etc/cron.d/ dosyaları) her satır bir zamanlanmış görevi temsil eder ve genellikle şu formatı takip eder:

# ┌───────────── dakika (0 - 59)
# │ ┌───────────── saat (0 - 23)
# │ │ ┌───────────── ayın günü (1 - 31)
# │ │ │ ┌───────────── ay (1 - 12) (veya Jan, Feb, Mar...)
# │ │ │ │ ┌───────────── haftanın günü (0 - 6) (Pazar=0 veya 7) (veya Sun, Mon...)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <kullanıcı_adı> <çalıştırılacak_komut>  <- Sadece /etc/crontab ve /etc/cron.d/ için kullanıcı adı gerekir
# * * * * * <çalıştırılacak_komut>              <- Kullanıcı crontab'ı için (crontab -e ile düzenlenen)
  • İlk beş alan zamanlamayı belirler.

  • /etc/crontab ve /etc/cron.d/ dosyalarında altıncı alan komutun çalıştırılacağı kullanıcı adıdır. Kullanıcı crontab'larında bu alan bulunmaz, komut crontab sahibi kullanıcı olarak çalışır.

  • Geri kalan kısım ise çalıştırılacak komut veya betiktir.

Özel Karakterler:

  • * (Yıldız): İlgili alan için tüm olası değerleri ifade eder ("her"). Örneğin, dakika alanındaki * "her dakika" anlamına gelir.

  • , (Virgül): Değer listelerini ayırmak için kullanılır. Örneğin, saat alanındaki 8,12,18 "saat 8, 12 ve 18'de" anlamına gelir.

  • - (Tire): Değer aralıklarını belirtmek için kullanılır. Örneğin, haftanın günü alanındaki 1-5 "Pazartesiden Cumaya kadar" (Pazartesi=1) anlamına gelir.

  • / (Bölü): Adım değerlerini belirtmek için kullanılır. Örneğin, dakika alanındaki */15 "her 15 dakikada bir" (0, 15, 30, 45) anlamına gelir. Saat alanındaki 8-18/2 "saat 8'den 18'e kadar her 2 saatte bir" (8, 10, 12, 14, 16, 18) anlamına gelir.

Özel Zaman Dizgeleri: Bazı cron implementasyonları, yaygın zamanlamalar için özel dizgeleri destekler:

  • @reboot: Sistem başlangıcında bir kez çalıştırılır.

  • @yearly veya @annually: Yılda bir kez çalıştırılır (0 0 1 1 *).

  • @monthly: Ayda bir kez çalıştırılır (0 0 1 * *).

  • @weekly: Haftada bir kez çalıştırılır (0 0 * * 0).

  • @daily veya @midnight: Günde bir kez çalıştırılır (0 0 * * *).

  • @hourly: Saatte bir kez çalıştırılır (0 * * * *).

Örnek Crontab Satırları:

# Her gece 02:30'da yedekleme betiğini çalıştır
30 2 * * * /usr/local/bin/yedekle.sh

# Her Pazartesi sabah 05:00'te sistemi güncelle (apt örneği)
0 5 * * 1 apt update && apt upgrade -y

# Her 15 dakikada bir disk kullanımını logla
*/15 * * * * df -h >> /var/log/disk_kullanimi.log

# Her ayın 1'inde saat 04:05'te root olarak bir betik çalıştır (/etc/cron.d/ veya /etc/crontab içinde)
5 4 1 * * root /opt/aylik_rapor.sh

# Sistem her başladığında bir kontrol yap
@reboot /usr/local/bin/baslangic_kontrolu.sh

crontab Komutu

Kullanıcılar kendi crontab dosyalarını yönetmek için crontab komutunu kullanır:

  • crontab -e: Mevcut kullanıcının crontab dosyasını düzenlemek için varsayılan metin düzenleyiciyi açar. İlk kez çalıştırıldığında genellikle hangi düzenleyiciyi kullanmak istediğinizi sorar. Dosyayı kaydedip çıktığınızda yeni zamanlanmış görevler aktif olur.

  • crontab -l: Mevcut kullanıcının crontab dosyasının içeriğini listeler.

  • crontab -r: Mevcut kullanıcının crontab dosyasını komple siler. Dikkatli kullanılmalıdır! Yanlışlıkla silmeye karşı genellikle onay istemez.

  • crontab -u <kullanıcı_adı> -e|-l|-r: (Sadece root tarafından) Belirtilen kullanıcının crontab dosyasını yönetmek için kullanılır.

Ortam Değişkenleri ve Çıktı Yönetimi

  • Ortam: Cron görevleri, normal bir kullanıcı kabuğuna göre çok daha kısıtlı bir ortam değişkeni seti ile çalışır. Özellikle PATH değişkeni sınırlı olabilir. Bu nedenle, cron görevlerinde çalıştırılan komutların veya betiklerin içinde kullanılan diğer komutların tam yollarını belirtmek (örn. /usr/bin/python3 yerine sadece python3 yazmamak) genellikle daha güvenilirdir. Crontab dosyasının başına PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin gibi bir satır ekleyerek PATH'i ayarlamak da mümkündür.

  • Çıktı: Varsayılan olarak, bir cron görevinin standart çıktısı (stdout) veya standart hatası (stderr) olursa, bu çıktı crontab sahibi kullanıcıya e-posta olarak gönderilir (eğer sistemde bir posta transfer ajanı - MTA - yapılandırılmışsa).

    • Çıktıyı bir dosyaya yönlendirmek için standart kabuk yönlendirmeleri kullanılır:

      * * * * * /path/to/command > /var/log/myjob.log 2>&1 

      (> üzerine yazar, >> sona ekler, 2>&1 stderr'i stdout'a yönlendirir).

    • Tüm çıktıyı engellemek için /dev/null'a yönlendirilebilir:

      * * * * * /path/to/command > /dev/null 2>&1
    • E-postanın gönderileceği adresi değiştirmek için crontab dosyasının başına MAILTO değişkeni eklenebilir:

      MAILTO="admin@example.com"
      * * * * * /path/to/command 
    • E-posta gönderimini tamamen engellemek için MAILTO boş bırakılabilir:

      MAILTO=""
      * * * * * /path/to/command 

cron, sistem bakımı, yedekleme, raporlama gibi birçok görevi otomatikleştirmek için vazgeçilmez bir araçtır.

Last updated