Crontab Rehberi: Linux'ta Zamanlanmış Görevler
Cron, Unix/Linux sistemlerinde belirli aralıklarla veya zamanlarda komutları otomatik olarak çalıştıran bir daemon'dır. Yedekleme, log rotasyonu, raporlama, veri senkronizasyonu gibi tekrar eden görevleri otomatize etmek için kullanılır.
💡 Cron ifadelerini grafiksel olarak oluşturmak için: MagmaNex Cron Generator aracını kullanın.
Crontab Sözdizimi
* * * * * /path/to/komut
│ │ │ │ │
│ │ │ │ └── Haftanın günü (0-7, 0 ve 7 = Pazar)
│ │ │ └──── Ay (1-12)
│ │ └────── Ayın günü (1-31)
│ └──────── Saat (0-23)
└────────── Dakika (0-59)
Özel Karakter Açıklamaları
| Karakter | Anlamı | Örnek |
|---|---|---|
* |
Her değer | * * * * * = Her dakika |
, |
Birden fazla değer | 1,15,30 = 1., 15. ve 30. dakika |
- |
Aralık | 9-17 = 09:00-17:00 arası her saat |
/ |
Adım | */5 = Her 5'te bir |
Pratik Örnekler
Günlük / Haftalık / Aylık
# Her gece saat 02:00'de veritabanı yedeği
0 2 * * * /usr/local/bin/backup-db.sh
# Her Pazartesi 09:00'da haftalık rapor
0 9 * * 1 /scripts/weekly-report.py
# Her ayın 1'inde 00:00'da log temizleme
0 0 1 * * find /var/log -name "*.log" -mtime +30 -delete
# Her Cuma 18:00'da hafta sonu backup
0 18 * * 5 /scripts/weekend-backup.sh
Her N Dakikada / Saatte
# Her 5 dakikada bir sağlık kontrolü
*/5 * * * * /scripts/health-check.sh
# Her 15 dakikada veri senkronizasyonu
*/15 * * * * /usr/bin/python3 /scripts/sync-data.py
# Her 2 saatte cache temizleme
0 */2 * * * redis-cli FLUSHEXPIRED
# Her 30 dakikada SSL sertifika kontrolü
*/30 * * * * /scripts/check-ssl.sh
Mesai Saatlerinde
# Hafta içi 09:00-18:00 arası her saat
0 9-18 * * 1-5 /scripts/business-task.sh
# Mesai saatlerinde her 10 dakikada
*/10 9-18 * * 1-5 /scripts/monitor.sh
# Sadece Cumartesi ve Pazar
0 10 * * 6,0 /scripts/weekend-task.sh
Özel Zaman Kısayolları
@reboot # Sistem açılışında bir kez çalış
@yearly # 0 0 1 1 * — Yılda bir
@monthly # 0 0 1 * * — Ayda bir
@weekly # 0 0 * * 0 — Haftada bir (Pazar gece yarısı)
@daily # 0 0 * * * — Her gün gece yarısı
@hourly # 0 * * * * — Her saat başı
# Sistem açılışında servisi başlat
@reboot /usr/local/bin/myservice start
# Her yıl SSL sertifikasını yenile
@yearly certbot renew
Crontab Yönetimi
# Mevcut crontab'ı düzenle
crontab -e
# Mevcut crontab'ı listele
crontab -l
# Crontab'ı sil (DİKKATLİ OL!)
crontab -r
# Başka kullanıcının crontab'ını düzenle (root)
crontab -u kullanici -e
# Crontab'ı dosyadan yükle
crontab /path/to/mycrontab.txt
# Crontab'ı dosyaya kaydet
crontab -l > /backup/crontab-backup.txt
Çıktı ve Log Yönetimi
Varsayılan olarak cron çıktısını e-posta ile gönderir. Bunu genellikle istemeyiz:
# Tüm çıktıyı sustur
0 2 * * * /scripts/backup.sh > /dev/null 2>&1
# Sadece hataları logla
0 2 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1
# Hem stdout hem stderr logla (timestamp ile)
0 2 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1; echo "[$(date)] Tamamlandı" >> /var/log/backup.log
# Log rotation ile birlikte kullan (logrotate)
0 2 * * * /scripts/backup.sh >> /var/log/app/backup.log 2>&1
Log Dosyasını İzleme
# Cron daemon loglarını izle
tail -f /var/log/syslog | grep CRON
tail -f /var/log/cron
# systemd sistemlerde
journalctl -u cron -f
journalctl -u cron --since "1 hour ago"
Ortam Değişkenleri
Cron kendi minimal ortamıyla çalışır. PATH genellikle /usr/bin:/bin ile sınırlıdır:
# Crontab'ın başına ortam değişkeni ekle
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO="" # E-posta bildirimini kapat
HOME=/root
# Veya script içinde tanımla
#!/bin/bash
export PATH=/usr/local/bin:$PATH
source /etc/environment
Best Practices
1. Her zaman tam yol kullan
# ❌ Kötü — PATH'e bağlı
* * * * * python3 script.py
# ✅ İyi — tam yol
* * * * * /usr/bin/python3 /home/user/scripts/script.py
2. Flock ile çakışmayı önle
Uzun süren görevler bir sonraki çalışmayla çakışabilir:
# Önceki işlem bitmeden yenisini başlatma
*/5 * * * * /usr/bin/flock -n /tmp/mylock.lock /scripts/long-task.sh
3. Hata bildirimi ekle
#!/bin/bash
# /scripts/backup.sh
set -euo pipefail
if ! pg_dump mydb > /backups/backup.sql; then
echo "HATA: Veritabanı yedeği başarısız!" | \
mail -s "Cron Hatası" admin@example.com
exit 1
fi
echo "$(date): Yedek başarıyla oluşturuldu" >> /var/log/backup.log
4. Test önce çalıştır
# Cron komutu olarak çalıştırmadan önce test et
bash -x /scripts/backup.sh
# Cron ortamını simüle et
env -i HOME=/root SHELL=/bin/bash PATH=/usr/bin:/bin bash /scripts/backup.sh
5. Sistem genelinde cron vs kullanıcı cron
# /etc/crontab veya /etc/cron.d/ — kullanıcı belirtmek gerekir
0 2 * * * root /scripts/system-backup.sh
# /var/spool/cron/crontabs/user — kullanıcı crontab
0 2 * * * /scripts/user-backup.sh
Systemd Timer Alternatifi
Modern Linux dağıtımlarında cron yerine systemd timer kullanabilirsiniz:
# /etc/systemd/system/backup.service
[Unit]
Description=Veritabanı Yedeği
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-db.sh
User=backup
# /etc/systemd/system/backup.timer
[Unit]
Description=Her gece 02:00 backup
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl enable backup.timer
systemctl start backup.timer
systemctl list-timers # Tüm timer'ları listele
Systemd timer avantajları: Bağımlılık yönetimi, detaylı loglama, kaçırılan çalıştırmaları telafi etme (Persistent=true).
Yaygın Hatalar
| Hata | Sebebi | Çözüm |
|---|---|---|
| Komut çalışmıyor | Yanlış PATH | Tam yol kullan |
| İzin reddedildi | Script çalıştırılabilir değil | chmod +x script.sh |
| Ortam değişkeni yok | Cron minimal PATH | source ~/.bashrc ekle |
| Her dakika çalışıyor | * * * * * yerine doğru ifade |
Cron generator kullan |
| Zamanlama yanlış | Timezone farkı | TZ=Europe/Istanbul ekle |
Özet
Cron, Linux sistemlerinin vazgeçilmez otomasyon aracıdır. Temel sözdizimini öğrendikten sonra kompleks zamanlama senaryoları için MagmaNex'in Cron Generator aracını kullanabilirsiniz — ifadeyi görsel olarak oluşturun, ne anlama geldiğini anında görün.
Sistem yönetimiyle ilgili diğer araçlarımız:
- Chmod Calculator — Linux dosya izinleri
- Unix Timestamp — Zaman dönüşümleri
- Gitignore Generator — Proje .gitignore dosyaları

