Giriş
Zamanlanmış görevler yedekleme, rapor üretimi, cache temizleme ve health check için vazgeçilmezdir. Linux'ta cron klasik çözümdür; systemd timer modern alternatiftir.
systemd timer'lar journal entegrasyonu, bağımlılık yönetimi ve monotonik saat avantajları sunar.
Bu rehberde her iki yöntemi karşılaştırıp üretim önerileri sunuyoruz.
crontab Sözdizimi
crontab -e kullanıcı crontab'ını düzenler. /etc/crontab sistem geneli. Beş alan: dakika saat gün ay haftanın_günü komut.
*/5 * * * * her 5 dakikada. 0 2 * * * her gece 02:00. @reboot boot'ta çalışır.
# Kullanıcı crontab
crontab -e
# Örnekler
0 3 * * * /opt/backup/backup.sh
*/15 * * * * /opt/healthcheck.sh
0 0 1 * * /opt/reports/monthly.shCron Ortam ve Güvenlik
Cron minimal ortam değişkeni ile çalışır; PATH tam yol kullanın. MAILTO hata çıktısı için e-posta (genelde journal'a yönlendirin).
Script'lerde set -euo pipefail kullanın. Cron dosyaları 600 izinli olmalıdır.
#!/bin/bash
set -euo pipefail
export PATH=/usr/local/bin:/usr/bin:/bin
cd /opt/myapp
./manage.py cleanup_sessionssystemd Timer Unit
.timer ve .service çifti gerekir. OnCalendar=*-*-* 02:00:00 cron eşdeğeri. Persistent=true kaçırılan çalıştırmayı telafi eder.
AccuracySec=1min gecikme toleransı. RandomizedDelaySec yük dağıtımı.
# backup.timer
[Unit]
Description=Daily backup
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.targetTimer Service Unit
.service unit asıl komutu çalıştırır. Type=oneshot tek seferlik görev. User=deploy düşük yetki.
systemctl enable --now backup.timer timer'ı aktifleştirir.
# backup.service
[Unit]
Description=Backup job
[Service]
Type=oneshot
User=backup
ExecStart=/opt/backup/backup.shCron vs systemd Timer
Cron: basit, evrensel, her Unix'te bilinir. Timer: journal log, bağımlılık, resource limit, monotonic clock.
Yeni projelerde systemd timer tercih edin; mevcut cron script'leri çalışmaya devam eder.
Kritik görevlerde çift tetikleme (cron + timer) kullanmayın; tek mekanizma seçin.
İzleme ve Hata Yönetimi
systemctl list-timers --all timer durumunu gösterir. journalctl -u backup.service son çalıştırma logları.
Başarısız cron görevleri sessizce kaybolabilir; mutlaka log ve alerting ekleyin.
- Tam yol kullanın
- set -euo pipefail
- Log ve alert
- Timer için Persistent=true
- Düzenli list-timers kontrolü
Sonuç
Cron ve systemd timer ikisi de geçerli; timer modern dağıtımlarda avantajlıdır. Görevleri versiyon kontrolünde tutun ve test edin.
Yedekleme ve kritik görevler için alerting zorunludur.