22.06.2020

Systemd zamanlayıcıları (timers)

Uzun yıllardır linux dünyasındaki cron görevlerinin yerini systemd ile birlikte zamanlayıcılar almaya başlıyor. Yeni bir zamanlayıcı yaratmaya çalışacağım.

Örnek olarak her pazar gecesi çalışması gereken bir "eski dosyaları silme" görevimiz olsun. Bu iş için eski_dosyalari_sil.sh dosyasının içeriği şöyle olabilir:

#!/bin/bash
find /user/metin/ -mtime -180 -exec rm -rf {} -

Bu dosyayı örneğin profilimizin altına kaydedip, çalıştırma yetkisi vermeyi unutmamak gerek:

$ chmod +x /home/metin/eski_dosyalari_sil.sh

Yapılması gereken 2 adımlı işimizin ilk adımı bir service birimi oluşturmak.

/usr/lib/systemd/system/temizlik.service

gibi bir yol ile kaydedeceğimiz dosyanın içeriği şöyle olabilir:

[Unit]
Description=Eski Dosyalari Silme

[Service]
Type=simple
ExecStart=/home/metin

[Install]

WantedBy=multi-user.target

İkinci adımda da bir zamanlayıcı (timer) birimi oluştırmalıyız. Bunun için de

/usr/lib/systemd/system/backup.timer

yolu ile şöyle bir dosya oluşturabiliriz:

[Unit]
Description=Execute backup every night

[Timer]
OnCalendar=*-*-* 00:00:00
Unit=temizlik.service

[Install]
WantedBy=multi-user.target

Bu adımdan sonra yapılacak tek şey zamanlayıcı birimini systemctl ile etkinleştirip başlatmak:

$ sudo systemctl enable temizlik.timer
$ sudo systemctl start temizlik.timer

temizlik.timer birim dosyası içinde OnCalendar satırında ne zaman çalışacağı belirtiliyor. Yukarıdaki örnekte yazılan

Calendar=*-*-* 00:00:00

UTC'ye göre 00:00:00 her gün demek. cron görevlerindeki zamanlama gibi buradaki sıra da yıl *-*-* için yıl-ay-gün şeklinde. Bundan sonraki 00:00:00 günün saati anlamında. Bunun yerine

Calendar=daily

de kullanılabilirdi.
Daha fazla örnek için [3] veya [4]'e bakılabilir. Persistent=true gibi bir komutla sistem açıldığında kaçırlmış görevlerin de çalıştırılması sağlanabilir.

service veya timer dosyalarında bir değişiklik yaptıktan sonra etkili olabilmesi için hizmetleri tekrar çalıştırma veya aşağıdaki gibi tekrar yüklemeliyiz:

# systemctl daemon-reload

Mevcut sistemdeki tüm aktif zamanlayıcıları görmek için

$ systemctl list-timers

kullanılabilir. Pasif olanları da görmek için --all anahtarı eklenebilir.

---

Hiç yorum yok: