1. #!trpst#trp-gettext data-...
  2. #!trpst#trp-gettext data-...
  3. Linux
  4. Servisler
  5. Systemd Timer: Cron Yerine Modern Servis Zamanlayıcıları Kullanmak

Systemd Timer: Cron Yerine Modern Servis Zamanlayıcıları Kullanmak

Print

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.
ÖzellikCronSystemd Timer
LoglamaHarici dosya yönlendirmesi gerekirjournalctl 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üYokCgroups (RAM/CPU sınırlama) desteği
Zamanlama HassasiyetiYalnızca Dakika seviyesiSaniye ve milisaniye seviyesi
Manuel TetiklemeKomutu elle bulup çalıştırmak gerekirsystemctl start gorev.service ile anında test

Adım Adım Systemd Timer Oluşturma

Bir Systemd Timer kurmak için iki dosya gereklidir:

  1. Servis Birimi (.service): Neyin çalıştırılacağını tanımlar.
  2. 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=oneshot tipi 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:

SenaryoOnCalendar İfadesi
Her saat başı-- :00:00 (veya hourly)
Her gün gece yarısı--* 00:00:00 (veya daily)
Her Pazartesi saat 08:00Mon --* 08:00:00
Haftaiçi her gün 09:00Mon..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.

Tags , , , , ,

How can we help?