X

Lütfen Ülke (Bölge) Seçiniz

Türkiye (Türkçe)Türkiye (Türkçe)
X
X

Lütfen Ülke (Bölge) Seçiniz

Türkiye (Türkçe)Türkiye (Türkçe)
X
🔥 Türkiye Lokasyon VDS & VPS sunucularında %20 indirim! Kupon Kodu: Türkiye'de %20 İndirim! Kod: DATA20
Şirketimizdeki KALİTEYİ Yakından Tanıyın!

Linux Cron Job ile Zamanlanmış Görevler Rehberi

Linux Cron Job ile Zamanlanmış Görevler Rehberi

Cron job, Linux sunucularda bir komutun veya betiğin belirli zamanlarda otomatik çalışmasını sağlayan zamanlanmış görevdir. Gece yedekleri, günlük temizliği, sertifika kontrolleri ve uygulama zamanlayıcıları gibi tekrar eden işlerin neredeyse tamamı cron ile yürür. Bu rehberde crontab söz dizimini örneklerle açıklıyor, Ubuntu 22.04/24.04 ve AlmaLinux 9 arasındaki farkları belirtiyor ve cron işlerinin sessizce başarısız olmasına yol açan tuzakları anlatıyoruz.

Cron Nasıl Çalışır?

Cron, arka planda sürekli çalışan bir servistir ve her dakika zamanlama tablolarını (crontab) kontrol ederek zamanı gelen görevleri başlatır. Servis adı ve paketi dağıtıma göre farklıdır:

ÖzellikUbuntu 22.04/24.04AlmaLinux 9
Paketcroncronie
Servis adıcroncrond
Kullanıcı crontab'ları/var/spool/cron/crontabs//var/spool/cron/
Çalışma günlüklerijournalctl -u cron veya /var/log/syslog/var/log/cron
Günlük/haftalık klasörleri çalıştıran/etc/crontab (anacron kuruluysa anacron)anacron (/etc/anacrontab)

Servisin çalıştığını kontrol edin. Minimal AlmaLinux kurulumlarında cronie paketi eksikse önce kurun:

# Ubuntu
systemctl status cron

# AlmaLinux 9
sudo dnf install cronie
sudo systemctl enable --now crond

Crontab Söz Dizimi

Her cron satırı beş zaman alanı ve ardından çalıştırılacak komuttan oluşur:

┌───────── 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

Alanlarda şu özel karakterler kullanılır:

  • * her değer anlamına gelir (her dakika, her saat gibi).
  • , liste belirtir: 1,15 ayın 1'i ve 15'i.
  • - aralık belirtir: 1-5 Pazartesiden Cumaya.
  • / adım belirtir: */10 her 10 dakikada bir.

Önemli bir ayrıntı: Hem ayın günü hem de haftanın günü alanına değer yazarsanız cron bu ikisini veya mantığıyla birleştirir. Örneğin 0 3 1 * 1 satırı, her ayın 1'inde ve her Pazartesi çalışır; yalnızca Pazartesiye denk gelen ayın 1'inde değil.

Kısayol İfadeleri

İfadeKarşılığıAnlamı
@reboot-Sunucu her açıldığında bir kez
@hourly0 * * * *Her saat başı
@daily0 0 * * *Her gün gece yarısı
@weekly0 0 * * 0Her Pazar gece yarısı
@monthly0 0 1 * *Her ayın 1'i gece yarısı
@yearly0 0 1 1 *Her yıl 1 Ocak gece yarısı

Crontab Düzenleme Komutları

crontab -e          # kendi crontab'ınızı düzenler
crontab -l          # kendi crontab'ınızı listeler
sudo crontab -u www-data -e   # başka bir kullanıcının crontab'ını düzenler
crontab -r          # crontab'ı SORMADAN tamamen siler

crontab -r ile crontab -e klavyede yan yana olan harflerdir ve -r onay istemeden tüm görevleri siler. Bu yüzden önemli sunucularda crontab'ın bir kopyasını düzenli olarak saklayın: crontab -l > ~/crontab-yedek.txt. Geri yüklemek için crontab ~/crontab-yedek.txt yeterlidir.

crontab -e komutu dosyayı kaydettiğinizde söz dizimini kontrol eder ve hatalı satır varsa sizi uyarır. Bu nedenle /var/spool/cron altındaki dosyaları doğrudan düzenlemeyin.

Sistem Genelindeki Cron Dosyaları

Kullanıcı crontab'larının yanında sistem genelinde kullanılan konumlar da vardır:

  • /etc/crontab ve /etc/cron.d/: Buradaki satırlarda zaman alanlarından sonra hangi kullanıcıyla çalışacağını belirten fazladan bir kullanıcı alanı bulunur. Paketlerin kurduğu görevler genellikle cron.d altındadır.
  • /etc/cron.hourly/, cron.daily/, cron.weekly/, cron.monthly/: İçine konan çalıştırılabilir betikler ilgili aralıklarla çalışır. Ubuntu'da bu klasörler run-parts ile çalıştırıldığından dosya adlarında nokta bulunmamalıdır; yedek.sh adlı bir betik atlanır, yedek adlı betik çalışır.
# /etc/cron.d/ornek-temizlik
30 4 * * * root /usr/local/bin/temizlik

Pratik Cron Örnekleri

ZamanlamaAnlamı
*/5 * * * *Her 5 dakikada bir
0 3 * * *Her gün 03:00'te
30 2 * * 0Her Pazar 02:30'da
0 9-18 * * 1-5Hafta içi 09:00 ile 18:00 arasında her saat başı
0 0 1 */3 *Üç ayda bir, ayın 1'inde gece yarısı
15 1 * * 6Her Cumartesi 01:15'te

Örnek 1: Günlük Veritabanı Yedeği

Veritabanı parolasını cron satırına yazmak yerine, yalnızca root'un okuyabildiği bir /root/.my.cnf dosyasında tutun:

[client]
user=yedek_kullanici
password=Guclu-Bir-Parola
sudo chmod 600 /root/.my.cnf
sudo mkdir -p /root/yedek

Ardından root'un crontab'ına (sudo crontab -e) şu satırları ekleyin:

0 3 * * * /usr/bin/mysqldump --single-transaction uygulama_db 2>> /var/log/db-yedek.log | /usr/bin/gzip > /root/yedek/db-$(date +\%F).sql.gz
30 3 * * * /usr/bin/find /root/yedek -name '*.sql.gz' -mtime +7 -delete

İlk satır her gece 03:00'te veritabanını tarih damgalı bir dosyaya yedekler, ikinci satır yedi günden eski yedekleri siler. date komutundaki % işaretinin önündeki ters eğik çizgiye dikkat edin; bunun nedenini aşağıda açıklıyoruz. Yedeklerin aynı sunucuda durmasının tek başına yeterli olmadığını, sunucu dışına kopyalanması gerektiğini VDS yedekleme stratejileri yazımızda ayrıntılı anlattık.

Örnek 2: WordPress'te wp-cron'u Gerçek Cron'a Taşımak

WordPress, zamanlanmış görevlerini varsayılan olarak ziyaretçi geldiğinde tetiklenen wp-cron ile çalıştırır. Trafiği az sitelerde görevler gecikir, yoğun sitelerde ise gereksiz yük oluşur. wp-config.php dosyasına şu satırı ekleyin:

define('DISABLE_WP_CRON', true);

Ardından web sunucusu kullanıcısının crontab'ına şu görevi ekleyin:

*/5 * * * * /usr/bin/curl -s https://ornek.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

Örnek 3: Laravel Zamanlayıcısı

Laravel uygulamalarında tüm zamanlanmış görevler uygulama içinde tanımlanır ve cron'a tek bir satır eklenir:

* * * * * cd /var/www/uygulama && /usr/bin/php artisan schedule:run >> /dev/null 2>&1

Cron İşleri Neden Sessizce Başarısız Olur?

Terminalde sorunsuz çalışan bir komutun cron'da çalışmaması çok yaygındır. Sebepler neredeyse her zaman aynıdır:

  1. Kısıtlı PATH: Cron, oturum açtığınızdaki ortam değişkenlerini yüklemez ve PATH genellikle yalnızca /usr/bin:/bin içerir. /usr/local/bin veya /usr/sbin altındaki komutlar bulunamaz. Çözüm: komutlarda tam yol kullanın (which mysqldump ile öğrenebilirsiniz) veya crontab'ın başına PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin satırını ekleyin.
  2. Kaçışsız yüzde işareti: Crontab satırlarında % özel bir karakterdir ve yeni satır olarak yorumlanır. date +%F yazarsanız komut ortadan bölünür. Her % işaretini \% olarak yazın.
  3. Farklı kabuk: Cron komutları varsayılan olarak /bin/sh ile çalışır. Bash'e özgü söz dizimi kullanıyorsanız crontab'ın başına SHELL=/bin/bash ekleyin veya komutu bir betiğe taşıyın.
  4. Göreli yollar ve çalışma dizini: Cron, işleri kullanıcının ev dizininde başlatır. Betik içindeki göreli dosya yolları beklediğiniz yeri göstermez.
  5. Çalıştırma izni: Betik dosyasının chmod +x ile çalıştırılabilir olması ve ilk satırında #!/bin/bash gibi bir yorumlayıcı satırı bulunması gerekir.
  6. Saat dilimi: Cron, sistem saat dilimine göre çalışır. Sunucu UTC'deyse 03:00 olarak yazdığınız görev Türkiye saatiyle 06:00'da çalışır. Ayrıntılar için sunucu saat dilimi ve NTP ayarı yazımıza bakın.

Çıktıları Günlüğe Yazma ve Hata Ayıklama

Cron, bir görevin çıktısını varsayılan olarak yerel e-posta ile kullanıcıya göndermeye çalışır. Sunucuda posta sistemi yoksa bu çıktılar kaybolur. Çıktıyı bir dosyaya yönlendirmek en pratik yöntemdir:

0 3 * * * /usr/local/bin/yedek >> /var/log/yedek.log 2>&1

>> standart çıktıyı dosyanın sonuna ekler, 2>&1 hata çıktısını da aynı dosyaya yönlendirir. Çıktı e-postalarını tamamen kapatmak için crontab'ın başına MAILTO="" satırını ekleyebilirsiniz.

Görevin gerçekten tetiklenip tetiklenmediğini görmek için:

# Ubuntu
journalctl -u cron --since today
grep CRON /var/log/syslog

# AlmaLinux 9
sudo tail -f /var/log/cron

Cron ortamını taklit ederek komutu test etmek için şu yöntem işinize yarar:

env -i SHELL=/bin/sh PATH=/usr/bin:/bin HOME=$HOME /bin/sh -c '/usr/local/bin/yedek'

Üst Üste Binen İşleri Önlemek

Her 5 dakikada çalışan bir görev bir gün 10 dakika sürerse, ikinci kopya birincisi bitmeden başlar. Bu durum yedeklerde veya veri senkronizasyonunda bozulmaya yol açabilir. flock komutu, önceki çalışma bitmediyse yenisinin başlamasını engeller:

*/5 * * * * /usr/bin/flock -n /tmp/senkron.lock /usr/local/bin/senkron

Cron Güvenliği İçin Öneriler

  • En az yetki: Her görevi root ile çalıştırmayın. Web uygulamasına ait görevleri web sunucusu kullanıcısının (Ubuntu'da www-data, AlmaLinux'ta Nginx için nginx) crontab'ına ekleyin.
  • Betik izinleri: Root'un çalıştırdığı bir betiği başka bir kullanıcı düzenleyebiliyorsa, o kullanıcı root yetkisi kazanabilir. Root görevlerindeki betikler root'a ait olmalı ve başkaları tarafından yazılamamalıdır.
  • Parolaları satıra yazmayın: Crontab satırlarındaki parolalar süreç listesinde ve yedeklerde görünür. Bunun yerine izinleri kısıtlanmış yapılandırma dosyaları kullanın.
  • Beklenmedik görevleri denetleyin: Ele geçirilmiş sunucularda saldırganlar kalıcılık için sıklıkla cron'a görev ekler. Tüm kullanıcıların crontab'larını ve /etc/cron.d içeriğini düzenli olarak gözden geçirin.

Alternatif: systemd Zamanlayıcıları

Modern dağıtımlarda cron'a alternatif olarak systemd timer'ları da kullanılabilir. Günlüklerin journal'da toplanması, kaçırılan çalışmaların sunucu açıldığında telafi edilmesi (Persistent=true) ve bağımlılık tanımlanabilmesi avantajlarıdır. Karşılığında her görev için bir servis ve bir zamanlayıcı dosyası yazmanız gerekir. Mevcut zamanlayıcıları systemctl list-timers ile görebilirsiniz; örneğin Certbot'un sertifika yenilemesi bu yöntemle çalışır. Basit ve tek satırlık işler için cron hâlâ en pratik seçenektir.

Sık Sorulan Sorular

Cron ile saniyede bir görev çalıştırabilir miyim?

Hayır, cron'un en küçük zaman birimi dakikadır. Daha sık çalışması gereken işler için systemd timer veya kendi döngüsü olan bir servis kullanın.

Cron görevi sunucu kapalıyken kaçırılırsa ne olur?

Klasik cron kaçırılan görevleri telafi etmez. Günlük, haftalık ve aylık klasörlerdeki betikler anacron ile çalıştırılıyorsa sunucu açıldığında telafi edilir. systemd timer'larda bunun için Persistent=true kullanılır.

Hangi kullanıcıların cron kullanabileceğini sınırlayabilir miyim?

Evet. /etc/cron.allow dosyası varsa yalnızca içinde listelenen kullanıcılar crontab kullanabilir. /etc/cron.deny ise listelenen kullanıcıları engeller.

Cron görevim çalışıyor mu, nasıl anlarım?

Görevin çıktısını bir günlük dosyasına yönlendirin ve cron günlüklerinde tetiklenme kaydını kontrol edin. Kritik görevlerde, iş başarıyla bittiğinde bir izleme servisine sinyal göndermek en güvenilir yöntemdir.

Cron job kullanımı, sunucu yönetimindeki tekrar eden işleri güvenilir şekilde otomatikleştirmenin temelidir. Görevlerinizin kaynak tüketimini takip etmek için performans izleme araçlarından yararlanabilirsiniz. Zamanlanmış görevlerinizi, yedeklerinizi ve uygulamalarınızı tam root yetkisiyle yönetebileceğiniz bir ortam için sanal sunucu kiralama seçeneklerimizi veya başlangıç düzeyi VPS paketlerimizi inceleyebilirsiniz.

VDS Sanal Sunucu
TÜRKİYE / ANKARA
₺139 /ay'dan başlayan
Paketleri İncele
  •  NVMe SSD Disk
  •  DDoS Koruması Dahil
  •  Limitsiz Trafik
  •  0–15 Dakikada Kurulum
  •  Windows - Linux
  •  7/24 Destek
Top
Destek Hattı0850 840 90 28

DNS Adresleri

ns1.datahost.net.tr
ns2.datahost.net.tr
DataHost Destek Çevrimiçi

Satış öncesi tüm sorularınız için WhatsApp hattımıza yazın; size hızlıca yardımcı olalım.

WhatsApp'tan Yaz