Linux dünyasında periyodik görevleri otomatikleştirmek denildiğinde akla ilk gelen araç onlarca yıldır cron olmuştur. Ancak modern dağıtımlarda hata yakalama yetersizliği, loglama eksikliği ve bağımlılık yönetimi olmaması nedeniyle cron yerini giderek daha gelişmiş olan systemd mekanizmasına bırakmaktadır. Bu noktada systemd timer kullanımı, zamanlanmış görevlerinizi güvenli, izlenebilir ve esnek bir yapıya kavuşturur.
Bu rehberde; Cron ile Systemd Timer arasındaki farkları, bir .service ve eşleşen .timer dosyası oluşturmayı, takvim ifadelerini ve zamanlayıcı durumlarını systemctl ile denetlemeyi adım adım öğreneceğiz.
Neden Cron Yerine Systemd Timer?
Geleneksel cron tablolarında (crontab -e) tanımlanan bir görev hata verdiğinde bunu fark etmek oldukça zordur; çoğu zaman sessizce başarısız olur ya da sunucuda yapılandırılmamış yerel posta (mail) kutusuna hata yazar.
Systemd Timer mimarisinde ise:
- Entegre Loglama: Görevin çıktısı ve hataları doğrudan journalctl içine kaydedilir (
journalctl -u gorev.service). - Kaynak Kısıtlaması (cgroups): Görevin tüketeceği bellek ve işlemci miktarını sınırlayabilirsiniz (
MemoryMax=500M,CPUQuota=50%). - Kaçırılan Görevleri Çalıştırma (
Persistent=true): Eğer sunucu kapalıyken görevin çalışma saati geçtiyse, sunucu açıldığında bu görev otomatik olarak çalıştırılır (Cron bunu yapamaz). - Rastgele Gecikme (
RandomizedDelaySec): Onlarca sunucunun aynı anda yedekleme başlatıp ağı çökertmesini önlemek için görevlere rastgele gecikmeler eklenebilir. - Bağımlılık Yönetimi: Görevin yalnızca ağ aktifken (
After=network-online.target) çalışmasını sağlayabilirsiniz.
| Özellik | Cron | Systemd Timer |
|---|---|---|
| Loglama | Harici dosya yönlendirmesi gerekir | journalctl ile otomatik ve yapılandırılmış |
| Kaçırılan Çalıştırma (Catch-up) | Desteklemez (Anacron gerekir) | Persistent=true ile yerleşik destek |
| Kaynak Kontrolü | Yok | Cgroups (RAM/CPU sınırlama) desteği |
| Zamanlama Hassasiyeti | Yalnızca Dakika seviyesi | Saniye ve milisaniye seviyesi |
| Manuel Tetikleme | Komutu elle bulup çalıştırmak gerekir | systemctl start gorev.service ile anında test |
Adım Adım Systemd Timer Oluşturma
Bir Systemd Timer kurmak için iki dosya gereklidir:
- Servis Birimi (
.service): Neyin çalıştırılacağını tanımlar. - Zamanlayıcı Birimi (
.timer): Servisin ne zaman çalıştırılacağını tanımlar.
Örnek Senaryo: Her gece saat 02:30’da çalışan bir veritabanı yedekleme otomasyonu kuralım.
Adım 1: Servis Dosyasını Oluşturun (/etc/systemd/system/db-backup.service)
[Unit]
Description=Günlük Veritabanı Yedekleme Servisi
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/backup_database.sh
StandardOutput=journal
StandardError=journal
# Kaynak Sınırlaması (Sunucuyu boğmaması için)
MemoryMax=1G
CPUQuota=50%
Önemli Not: Periyodik çalışan betikler için
Type=oneshottipi kullanılır. Bu, betiğin çalışıp başarıyla tamamlanacağını (arkada daemon olarak kalmayacağını) belirtir.
Adım 2: Zamanlayıcı Dosyasını Oluşturun (/etc/systemd/system/db-backup.timer)
Aynı isimle bir .timer dosyası oluşturduğunuzda systemd otomatik olarak aynı isimli .service dosyasını eşleştirir:
[Unit]
Description=db-backup.service için Günlük Zamanlayıcı
[Timer]
# Sistem açıldıktan 10 dakika sonra ilk kez çalışsın
OnBootSec=10min
# Her gün saat 02:30'da çalışsın
OnCalendar=*-*-* 02:30:00
# Sunucu kapalıyken saat geçtiyse açılışta hemen çalıştır
Persistent=true
# Aynı anda yük binmemesi için 5 dakikalık rastgele esneme payı ver
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
OnCalendar Zaman Sözdizimi (Takvim İfadeleri)
OnCalendar ifadesi formatı: DayOfWeek Year-Month-Day Hour:Minute:Second şeklindedir:
| Senaryo | OnCalendar İfadesi |
|---|---|
| Her saat başı | -- :00:00 (veya hourly) |
| Her gün gece yarısı | --* 00:00:00 (veya daily) |
| Her Pazartesi saat 08:00 | Mon --* 08:00:00 |
| Haftaiçi her gün 09:00 | Mon..Fri --* 09:00:00 |
| Her 15 dakikada bir | *:0/15 |
| Ayın 1’i ve 15’i saat 03:00 | --01,15 03:00:00 |
Takvim İfadesini Test Etmek: systemd-analyze calendar
Zamanlama ifadenizin doğru olup olmadığını ve bir sonraki çalışmanın ne zaman olacağını kontrol etmek için harika bir komut vardır:
systemd-analyze calendar "Mon..Fri *-*-* 09:00:00"
Çıktıda bir sonraki tetiklenme anı milisaniyesine kadar doğrulanır.
Zamanlayıcıyı Etkinleştirmek ve İzlemek
Dosyaları oluşturduktan sonra systemd’yi haberdar edin:
# 1. Systemd yapılandırmasını yeniden tara
sudo systemctl daemon-reload
# 2. Timer birimini sistem açılışına ekle ve hemen başlat
sudo systemctl enable --now db-backup.timer
Zamanlayıcı Listesini Kontrol Etmek (list-timers)
Sistemdeki tüm aktif zamanlayıcıları, en son ne zaman çalıştıklarını ve bir sonraki çalışmaya ne kadar kaldığını görmek için:
systemctl list-timers
Örnek Çıktı:
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sun 2026-10-18 02:30:00 UTC 7h left Sat 2026-10-17 02:30:00 UTC 16h ago db-backup.timer db-backup.service
Servisi Manuel Olarak Test Etmek
Zamanlayıcının saatini beklemeden betiğin çalışıp çalışmadığını test etmek için doğrudan servisi başlatabilirsiniz:
sudo systemctl start db-backup.service
# Ve hemen loglarına bakın:
sudo journalctl -u db-backup.service -n 20
Özet
Modern Linux otomasyonlarında güvenilirlik arıyorsanız crontab yerine systemd timer mimarisini tercih etmelisiniz. Entegre loglama, cgroup kaynak kontrolleri ve Persistent=true ile sunucu kapalıyken kaçan görevlerin otomatik telafi edilmesi, operasyonel sürekliliği güvenceye alır.