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ı?
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.
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.
Tekrar eden işi belirle
Backup, log temizliği, rapor üretimi veya servis kontrolü gibi düzenli işi seç.
Script haline getir
Komutu tek satırda bırakmak yerine okunabilir ve test edilebilir script dosyasına taşı.
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.
* * * * * ç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
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.
# 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
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 ç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.
# 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.
# 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.
nano /home/kullanici/scripts/backup.sh
#!/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.
chmod +x /home/kullanici/scripts/backup.sh
Sonra scripti cron’a ekleyebilirsin.
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.
# 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.
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.
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.
which docker
which php
which mysqldump
which node
Sonra script içinde komutun tam yolunu kullanabilirsin.
/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.
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.
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.
#!/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.
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.
date
timedatectl
Gerekirse zaman dilimi ayarlanabilir.
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.
#!/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
*/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.
#!/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"
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.
#!/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."
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.
# 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.
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.
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
- Linux man page: crontab(5) — Cron formatı, zaman alanları ve crontab dosya yapısı için teknik referans.
- Linux man page: crontab(1) — crontab komutunun listeleme, düzenleme ve silme davranışları için referans.
- Ubuntu Community Help: CronHowto — Ubuntu tarafında cron kullanımı için sade başlangıç dokümanı.
- systemd.timer resmi dokümantasyonu — Cron alternatifi olarak systemd timer yapısını anlamak için resmi kaynak.
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.
Yorumlar
Henüz yorum yok. İlk yorumu sen yaz!
Yorum Yaz