# ╔═══════════════════════════════════════════════════════════════════╗ # ║ SERVİS — uzun ömürlü arka plan süreci (systemd daemon) ║ # ╚═══════════════════════════════════════════════════════════════════╝ # Bu program bir DAEMON'dur: başlatılır, durdurulana kadar çalışır ve # SIGTERM/SIGINT geldiğinde AÇIK KAYNAKLARINI BIRAKARAK kapanır. # # Birim dosyası üretmek için: # kabalang birim ornekler/05-servis/01_nabiz_servisi.kbl --kullanici-birimi # # ⚠️ Üç tuzak, üçü de ölçülmüş: # 1. `servis.uyu()` DÖNÜŞÜNÜ DENETLE. `yanlis` dönerse "dur" demektir; # yok sayan döngü SIGTERM'i duymaz, systemd `TimeoutStopSec` sonunda # SIGKILL atar ve `dururken` kancası HİÇ çalışmaz. # 2. Döngü koşulu `servis.calisiyor_mu()` olmalı; `dogru` yazılırsa # program yalnız öldürülerek durur. # 3. `uyu()` DEĞİL `servis.uyu()` kullan: `uyu()` sinyalle uyanmaz, # kapanma tam bir uyku süresi gecikir. kullan kaba.sistem nabiz_dosyasi = "/tmp/kabalang-nabiz.log" tur = 0 servis "kabalang-nabiz": # ── Başlangıç kancası: bir kez, döngüden önce ───────────────────── baslarken: gunluk.bilgi(f"nabız dosyası: {nabiz_dosyasi}") dosya.yaz(nabiz_dosyasi, "") # ── Ana gövde: durdurulana kadar ────────────────────────────────── calisirken: iken servis.calisiyor_mu(): tur = tur + 1 yuk = sistem.cpu_kullanim() ram = sistem.ram_yuzde() dosya.ekle(nabiz_dosyasi, f"{tur} cpu=%{yuk} ram=%{ram}\n") eger yuk > 90: gunluk.uyari(f"işlemci yükü yüksek: %{yuk}") degilse: gunluk.bilgi(f"nabız {tur} · cpu %{yuk} · ram %{ram}") # 5 saniye bekle; sinyal gelirse ANINDA uyanır ve `yanlis` döner. eger degil servis.uyu(5000): kir # ── Kapanış kancası: kaynakları bırak ───────────────────────────── dururken: dosya.ekle(nabiz_dosyasi, f"kapandi tur={tur}\n") gunluk.bilgi(f"{tur} turdan sonra düzgün kapandı ({servis.durdurma_nedeni()})")