Hızlı özet

Cron, Linux sistemlerde belirli zamanlarda komut veya script çalıştırmak için kullanılan klasik zamanlayıcıdır. Her gün backup almak, her hafta log temizlemek, her 15 dakikada bir servis kontrolü yapmak veya ay sonunda rapor üretmek gibi işleri otomatikleştirmek için kullanılır.

Bu yazıda neler var?

  • Cron job nedir ve neden önemlidir?
  • Cron syntax nasıl okunur?
  • crontab -e, crontab -l, crontab -r komutları
  • Backup, log temizliği, cache temizliği ve servis kontrol örnekleri
  • Cron çıktısını log dosyasına yazdırma
  • “Script elle çalışıyor ama cron’da çalışmıyor” hatasının sebepleri
  • Cron mu systemd timer mı?
Ana fikir: Cron job, sunucuda tekrar eden işleri unutulmaz hale getiren en eski ama hâlâ en pratik otomasyon araçlarından biridir. Doğru kullanıldığında backup, raporlama ve bakım işleri insan hatasına bağlı kalmadan düzenli çalışır.

Cron Job Nedir?

Cron, Linux ve Unix benzeri sistemlerde belirli zamanlarda komut çalıştırmak için kullanılan zaman tabanlı bir görev zamanlayıcıdır. Bu görevlerin her birine genellikle “cron job” denir. Cron job, tek satırlık basit bir komut da olabilir; yüzlerce satırlık bir bakım scriptini çalıştıran planlı bir görev de olabilir.

Örneğin her gece saat 03:00’te veritabanı yedeği almak, her pazar log dosyalarını temizlemek, her 15 dakikada bir kritik servisleri kontrol etmek veya her ayın ilk günü rapor dosyası üretmek cron ile yapılabilecek tipik işlerdir.

Cron’un değerli olmasının sebebi sadeliğidir. Bir sunucuda “bunu düzenli olarak yapmayı unutmayayım” dediğin birçok işi, belirli bir takvime bağlayıp arka planda otomatik çalıştırabilirsin.

Cron, sunucudaki küçük tekrarları otomasyona çevirir. Küçük tekrarlar otomatikleşince, büyük hatalar azalır.

Neden Sunucu Yönetiminde Önemlidir?

Bir VPS veya Linux sunucu kurduğunda asıl mesele sadece servisi ayağa kaldırmak değildir. O servisin düzenli yedeklenmesi, loglarının kontrol edilmesi, disk kullanımının izlenmesi, zaman zaman cache temizliği yapılması ve kritik işlemlerin raporlanması gerekir.

Bu işler manuel yapılırsa bir süre sonra unutulur. Özellikle backup gibi konularda “aklıma gelince alırım” yaklaşımı risklidir. Çünkü yedek en çok ihtiyaç duyulduğu gün hatırlanır; o gün de genellikle çok geçtir.

Cron burada temel bir güvenlik ağı kurar. Backup scripti düzenli çalışır, log temizliği belirlenen gün yapılır, servis kontrolü arka planda döner, rapor dosyaları belli saatlerde üretilir. Yani sunucu bakımının önemli bir kısmı insan hafızasına bağlı kalmaz.

1

Tekrar eden işi belirle

Backup, log temizliği, rapor üretimi veya servis kontrolü gibi düzenli işi seç.

2

Script haline getir

Komutu tek satırda bırakmak yerine okunabilir ve test edilebilir script dosyasına taşı.

3

Cron ile zamanla

Scripti belirli dakika, saat, gün, ay veya haftanın gününe göre otomatik çalıştır.

Cron Syntax Nasıl Okunur?

Cron’un en meşhur kısmı beş yıldızlı zaman formatıdır: * * * * * Bu yapı ilk bakışta karışık görünebilir ama aslında çok basittir. Soldan sağa doğru dakika, saat, ayın günü, ay ve haftanın günü alanlarını temsil eder.

Cron temel formatı
* * * * * çalıştırılacak_komut
│ │ │ │ │
│ │ │ │ └── Haftanın günü: 0-7 arası, 0 ve 7 genellikle pazar
│ │ │ └──── Ay: 1-12
│ │ └────── Ayın günü: 1-31
│ └──────── Saat: 0-23
└────────── Dakika: 0-59
Alan
Anlamı
Örnek
1. alan
Dakika
0 = saatin başı, 30 = 30. dakika
2. alan
Saat
3 = gece 03:00, 14 = 14:00
3. alan
Ayın günü
1 = ayın 1’i, * = her gün
4. alan
Ay
1 = ocak, 12 = aralık
5. alan
Haftanın günü
0 veya 7 = pazar, 1 = pazartesi

Yıldız işareti “her değer” anlamına gelir. Örneğin dakika alanında * kullanırsan her dakika demektir. Saat alanında * kullanırsan her saat demektir. Bu yüzden * * * * * ifadesi her dakika çalış anlamına gelir.

crontab Komutları: Düzenle, Listele, Sil

Kullanıcıya ait cron görevlerini yönetmek için en sık kullanılan komut crontab komutudur. Her kullanıcı kendi crontab dosyasına sahip olabilir. Bu dosyalar doğrudan elle sistem klasörlerinden düzenlenmez; genellikle crontab komutu üzerinden yönetilir.

Temel crontab komutları
# Mevcut kullanıcının cron görevlerini düzenle
crontab -e

# Mevcut kullanıcının cron görevlerini listele
crontab -l

# Mevcut kullanıcının tüm cron görevlerini sil
crontab -r
Dikkat: crontab -r komutu mevcut kullanıcının tüm cron kayıtlarını siler. Özellikle canlı sunucuda çalıştırmadan önce crontab -l ile mevcut kayıtları kontrol etmek iyi alışkanlıktır.

Basit Cron Örnekleri

Cron’u öğrenmenin en iyi yolu örnekleri okumaktır. Aşağıdaki örnekler temel zamanlama mantığını hızlıca anlamanı sağlar.

Her dakika, her saat, her gün örnekleri
# Her dakika çalışır
* * * * * /home/kullanici/scripts/task.sh

# Her saat başı çalışır
0 * * * * /home/kullanici/scripts/hourly-task.sh

# Her gün 03:00'te çalışır
0 3 * * * /home/kullanici/scripts/daily-task.sh

# Her pazar 04:30'da çalışır
30 4 * * 0 /home/kullanici/scripts/weekly-task.sh

# Her ayın 1. günü 02:00'de çalışır
0 2 1 * * /home/kullanici/scripts/monthly-task.sh

Bazı özel ifadeler de kullanılabilir. Örneğin @daily, @weekly, @monthly gibi ifadeler daha okunabilir cron kayıtları yazmaya yardımcı olur.

Özel cron ifadeleri
# Her gün bir kez çalışır
@daily /home/kullanici/scripts/backup.sh

# Her hafta bir kez çalışır
@weekly /home/kullanici/scripts/cleanup-logs.sh

# Sistem açıldığında çalışır
@reboot /home/kullanici/scripts/startup-check.sh

Gerçek Dünya Örnekleri

Cron’un asıl değeri gerçek sunucu bakım işlerinde ortaya çıkar. Aşağıdaki örnekler VPS, Docker, veritabanı ve dosya bakım senaryolarında kullanılabilecek pratik fikirler verir.

Backup alma

Her gece veritabanı veya proje klasörü yedeği alınabilir. Yedek dosyaları tarihli isimlerle saklanabilir.

Log temizleme

Eski log dosyaları belirli gün aralığından sonra silinerek disk dolması önlenebilir.

Cache temizliği

Geçici cache klasörleri düzenli temizlenerek uygulama alanı kontrol altında tutulabilir.

Servis kontrolü

Kritik servislerin çalışıp çalışmadığı kontrol edilip hata durumunda log veya bildirim üretilebilir.

Pratik cron job örnekleri
# Her gün 03:00'te backup scriptini çalıştır
0 3 * * * /home/kullanici/scripts/backup.sh

# Her pazar 04:30'da log temizliği yap
30 4 * * 0 /home/kullanici/scripts/cleanup-logs.sh

# Her 15 dakikada bir servis kontrol scripti çalıştır
*/15 * * * * /home/kullanici/scripts/check-services.sh

# Her gün 01:15'te cache temizliği yap
15 1 * * * /home/kullanici/scripts/clear-cache.sh

# Her ayın 1. günü 06:00'da rapor üret
0 6 1 * * /home/kullanici/scripts/monthly-report.sh

Script Dosyası Oluşturup Cron ile Çalıştırmak

Cron içine çok uzun komutlar yazmak yerine işleri script dosyasına taşımak daha sağlıklıdır. Böylece komutu terminalde elle test edebilir, loglama ekleyebilir, hata kontrolü yapabilir ve scripti Git ile takip edebilirsin.

Örnek olarak basit bir backup scripti oluşturalım.

Backup script dosyası
nano /home/kullanici/scripts/backup.sh
backup.sh örneği
#!/usr/bin/env bash

set -e

BACKUP_DIR="/home/kullanici/backups"
SOURCE_DIR="/home/kullanici/projects"
DATE="$(date +%Y-%m-%d_%H-%M-%S)"

mkdir -p "$BACKUP_DIR"

tar -czf "$BACKUP_DIR/projects_$DATE.tar.gz" "$SOURCE_DIR"

echo "Backup tamamlandı: $BACKUP_DIR/projects_$DATE.tar.gz"

Scriptin çalışabilmesi için çalıştırma izni vermek gerekir.

Script çalıştırma izni
chmod +x /home/kullanici/scripts/backup.sh

Sonra scripti cron’a ekleyebilirsin.

Scripti cron ile her gün çalıştırma
crontab -e

# Her gün 03:00'te backup al
0 3 * * * /home/kullanici/scripts/backup.sh

Cron Çıktısını Log Dosyasına Yazdırmak

Yeni başlayanların en sık yaptığı hata cron çıktısını loglamamaktır. Script başarısız olur ama ekranda bir şey görünmediği için hata fark edilmez. Cron işleri arka planda çalıştığı için çıktı ve hata mesajlarını dosyaya yönlendirmek çok önemlidir.

Cron çıktısını log dosyasına yazdırma
# Standart çıktıyı ve hata çıktısını aynı log dosyasına yaz
0 3 * * * /home/kullanici/scripts/backup.sh >> /home/kullanici/logs/backup.log 2>&1

Buradaki >> ifadesi çıktıyı dosyanın sonuna ekler. 2>&1 ise hata çıktısını da aynı log dosyasına yönlendirir. Böylece script çalışmadığında neden çalışmadığını görebilirsin.

İyi alışkanlık: Her cron job için ayrı log dosyası kullanmak hata ayıklamayı çok kolaylaştırır. Örneğin backup.log, cleanup.log, services.log gibi dosyalar oluşturulabilir.

Hata Ayıklama: Cron Neden Çalışmadı?

Cron hatalarında en sinir bozucu durum şudur: Scripti terminalde elle çalıştırırsın, sorunsuz çalışır. Ama cron’a koyunca çalışmaz. Bunun sebebi genellikle cron’un terminaldeki kullanıcı ortamıyla birebir aynı ortamda çalışmamasıdır.

Kritik uyarı: Cron içinde çalışan komutlar, terminalde elle çalıştırdığın ortamla birebir aynı ortamda çalışmayabilir. Bu yüzden scriptlerde tam dosya yolları kullanılmalı, gerekli environment değişkenleri açıkça tanımlanmalı ve çıktı mutlaka log dosyasına yönlendirilmelidir.

1. Komut yolu eksik olabilir

Terminalde docker, php, node veya mysqldump gibi komutlar çalışıyor olabilir. Ama cron aynı PATH değerini kullanmadığı için bu komutları bulamayabilir.

Komutun tam yolunu bulma
which docker
which php
which mysqldump
which node

Sonra script içinde komutun tam yolunu kullanabilirsin.

Tam yol kullanımı
/usr/bin/docker ps
/usr/bin/php /home/kullanici/app/artisan schedule:run
/usr/bin/mysqldump --version

2. Script çalıştırma izni olmayabilir

Script dosyasının çalıştırılabilir olması gerekir. Aksi halde cron scripti çağırır ama izin hatası nedeniyle çalıştıramaz.

Çalıştırma izni verme
chmod +x /home/kullanici/scripts/check-services.sh

3. Kullanıcı yetkisi yetersiz olabilir

Cron job hangi kullanıcıya aitse o kullanıcının yetkileriyle çalışır. Kendi kullanıcının crontab’ına yazdığın bir komut, root yetkisi gerektiren bir işlemi yapamayabilir. Bu durumda ya izinleri doğru düzenlemek ya da gerçekten gerekiyorsa root crontab kullanmak gerekir.

Root crontab düzenleme
sudo crontab -e

Ancak root crontab kullanmak kolaycı bir çözüm gibi görülmemelidir. Gereksiz root yetkisi güvenlik riskidir. Önce doğru kullanıcı, doğru dosya izni ve doğru grup üyeliği kontrol edilmelidir.

4. .env dosyası okunmuyor olabilir

Uygulama scriptleri genellikle environment değişkenlerine ihtiyaç duyar. Terminalde elle çalıştırırken bu değişkenler shell profilinden veya aktif oturumdan geliyor olabilir. Cron ise bu ortamı otomatik olarak almayabilir.

Script içinde env dosyası okuma örneği
#!/usr/bin/env bash

set -e

cd /home/kullanici/app

if [ -f .env ]; then
  export $(grep -v '^#' .env | xargs)
fi

/usr/bin/php script.php

Daha güvenli ve karmaşık projelerde .env okuma işi dikkatli yapılmalıdır. Boşluk, özel karakter ve tırnak içeren değerlerde basit xargs yaklaşımı sorun çıkarabilir. Bu yüzden kritik sistemlerde uygulamanın kendi config yükleme mekanizmasını kullanmak daha sağlıklıdır.

5. Çıktı loglanmadığı için hata görünmüyor olabilir

Cron çalışıyor olabilir ama script hata veriyor olabilir. Log dosyası yoksa bunu fark etmek zorlaşır.

Log dosyasıyla güvenli cron kaydı
0 3 * * * /home/kullanici/scripts/backup.sh >> /home/kullanici/logs/backup.log 2>&1

6. Sunucu zaman dilimi beklenenden farklı olabilir

Cron sunucunun sistem saatine göre çalışır. Sunucu UTC’deyse ve sen yerel saate göre plan yaptıysan job beklediğinden farklı saatte çalışabilir.

Sunucu saatini ve zaman dilimini kontrol etme
date
timedatectl

Gerekirse zaman dilimi ayarlanabilir.

Zaman dilimi ayarlama örneği
sudo timedatectl set-timezone Europe/Istanbul

Servis Kontrol Scripti Örneği

Cron yalnızca backup için kullanılmaz. Örneğin kritik servislerin çalışıp çalışmadığını kontrol eden basit bir script yazılabilir.

check-services.sh örneği
#!/usr/bin/env bash

set -e

LOG_FILE="/home/kullanici/logs/service-check.log"
DATE="$(date '+%Y-%m-%d %H:%M:%S')"

SERVICES=("nginx" "docker")

for SERVICE in "${SERVICES[@]}"; do
  if systemctl is-active --quiet "$SERVICE"; then
    echo "$DATE - $SERVICE çalışıyor." >> "$LOG_FILE"
  else
    echo "$DATE - UYARI: $SERVICE çalışmıyor!" >> "$LOG_FILE"
  fi
done
Her 15 dakikada bir servis kontrolü
*/15 * * * * /home/kullanici/scripts/check-services.sh >> /home/kullanici/logs/check-services-cron.log 2>&1

Bu örnek basit tutulmuştur. İleri seviyede bu script Telegram, e-posta veya webhook bildirimi gönderecek hale getirilebilir. Ama cron tarafındaki temel mantık değişmez: belirli aralıkla script çalıştırılır, sonuç loglanır.

Veritabanı Backup Örneği

Cron’un en sık kullanıldığı alanlardan biri veritabanı yedeklemedir. Aşağıda MariaDB/MySQL için basit bir örnek yer alıyor. Canlı sistemlerde şifreyi doğrudan komut satırına yazmak yerine güvenli config dosyası veya secret yönetimi tercih edilmelidir.

MariaDB/MySQL backup script örneği
#!/usr/bin/env bash

set -e

BACKUP_DIR="/home/kullanici/backups/mysql"
DATE="$(date +%Y-%m-%d_%H-%M-%S)"
DB_NAME="ornek_veritabani"

mkdir -p "$BACKUP_DIR"

/usr/bin/mysqldump "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"

echo "Veritabanı yedeği alındı: ${DB_NAME}_${DATE}.sql.gz"
Her gece 03:10'da veritabanı backup
10 3 * * * /home/kullanici/scripts/mysql-backup.sh >> /home/kullanici/logs/mysql-backup.log 2>&1

Eski Yedekleri Temizleme

Backup almak kadar eski yedekleri temizlemek de önemlidir. Aksi halde disk alanı zamanla dolabilir. Örneğin 14 günden eski backup dosyalarını temizlemek için aşağıdaki gibi bir script kullanılabilir.

Eski backup dosyalarını temizleme
#!/usr/bin/env bash

set -e

BACKUP_DIR="/home/kullanici/backups"

find "$BACKUP_DIR" -type f -mtime +14 -name "*.gz" -delete

echo "14 günden eski backup dosyaları temizlendi."
Her pazar 04:30'da backup temizliği
30 4 * * 0 /home/kullanici/scripts/cleanup-backups.sh >> /home/kullanici/logs/cleanup-backups.log 2>&1

Cron Dosyaları Nerelerde Durur?

Kullanıcı bazlı cron kayıtları genellikle crontab -e ile yönetilir. Bunun dışında sistem genelinde kullanılan bazı cron alanları da vardır. Dağıtıma göre küçük farklılıklar olabilir ama genel mantık benzerdir.

Yaygın cron konumları
# Kullanıcı crontab'ı
crontab -e

# Sistem genel cron dosyası
/etc/crontab

# Paketlerin veya sistem görevlerinin cron dosyaları
/etc/cron.d/

# Periyodik klasörler
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

Yeni başlayanlar için en güvenli başlangıç noktası çoğu zaman kullanıcı crontab’ıdır. Sistem genel dosyaları düzenlemek daha dikkat ister; çünkü yanlış bir kayıt sistem seviyesinde sorun çıkarabilir.

Cron mu systemd Timer mı?

Modern Linux sistemlerde cron hâlâ çok kullanışlıdır. Fakat systemd kullanan sistemlerde systemd timer da güçlü bir alternatiftir. Özellikle servis bağımlılıkları, detaylı loglama, başarısız görevleri izleme ve systemd ekosistemiyle bütünleşme gerektiğinde timer yapısı daha profesyonel olabilir.

Araç
Güçlü olduğu taraf
Kimler için uygun?
Cron
Basit, klasik, hızlı öğrenilir. Tek satırla backup, log temizliği, rapor ve bakım işleri zamanlanabilir.
VPS kullanıcıları, basit otomasyon isteyenler, hızlı çözüm arayan sistem yöneticileri.
systemd timer
Servis bağımlılıkları, journalctl logları, unit yönetimi ve daha kontrollü sistem entegrasyonu sağlar.
Daha profesyonel servis yönetimi isteyenler, production sistemlerde izlenebilirlik arayanlar.

Kısa karar şöyle verilebilir: Basit ve tekrar eden bir script çalıştıracaksan cron yeterlidir. Bir servis gibi yönetilmesi, loglarının systemd üzerinden izlenmesi ve bağımlılıklarının tanımlanması gereken işler için systemd timer daha iyi olabilir.

Başlangıç İçin Güvenli Cron Kontrol Listesi

Cron job eklemeden önce küçük bir kontrol listesi kullanmak, uzun vadede çok hata önler.

Cron job eklemeden önce kontrol et:

1. Script terminalde elle çalışıyor mu?
2. Scriptte tam dosya yolları kullanıldı mı?
3. Scriptin çalıştırma izni var mı?
4. Doğru kullanıcı crontab’ına mı eklendi?
5. Çıktı log dosyasına yönlendirildi mi?
6. Sunucu zaman dilimi doğru mu?
7. Script hassas bilgileri güvenli şekilde mi okuyor?
8. Backup varsa eski yedek temizliği planlandı mı?

Faydalı Resmi Kaynaklar

Sonuç: Sunucuda Unutulmaması Gereken İşleri Cron’a Bırak

Cron job, Linux sunucu yönetiminde küçük ama çok etkili bir alışkanlıktır. Backup almak, log temizlemek, servis kontrol etmek, rapor üretmek, cache boşaltmak veya eski dosyaları silmek gibi tekrar eden işleri insan hafızasına bırakmak yerine zamanlanmış görevlere dönüştürür.

Bu yaklaşım özellikle VPS, Docker, WireGuard, veritabanı yedekleme, log bakımı ve küçük otomasyon işlerinde hayat kurtarır. Çünkü sistem büyüdükçe “bunu ara sıra yaparım” dediğin işler birikir. Cron bu işleri sessizce, düzenli ve tekrar edilebilir hale getirir.

Yine de cron kullanırken en kritik konu hata ayıklamadır. Komut terminalde çalışıyor diye cron içinde de çalışacağı varsayılmamalıdır. Tam dosya yolları, doğru kullanıcı, çalıştırma izni, environment değişkenleri, log yönlendirme ve zaman dilimi mutlaka kontrol edilmelidir.

Cron’un asıl mesajı basit: Sunucuda tekrar eden bir iş varsa, onu aklında tutma. Script haline getir, logla ve cron’a emanet et.