Systemd ile Hizmet Yönetimi: Unit Dosyaları, Limitler ve En İyi Uygulamalar
Systemd ile Hizmet Yönetimi: Unit Dosyaları, Limitler ve En İyi Uygulamalar
Son Güncelleme: Mart 2026
Giriş
Bu makalede systemd ile sunucu üzerinde hizmet yönetimi (service management), unit dosyaları yapısı, kaynak limitleri ve güvenlik ayarları hakkında pratik ve uygulanabilir bilgiler bulacaksınız. Hem VPS/VDS hem de kiralık sunucu ortamlarında kullanılabilecek örnek unit dosyaları, yeniden başlatma politikaları ve izleme tüyoları verilecektir.
İçindekiler
- Systemd Nedir?
- Unit Dosyası Yapısı
- Service Türleri ve Type Direktifleri
- Kaynak Limitleri (Limit, cgroups)
- Restart Politikaları ve Başarımlı Yeniden Başlatma
- Pratik Örnekler
- Güvenlik ve İzolasyon
- İzleme ve Log Yönetimi
- Sıkça Sorulan Sorular
- Sonuç
Systemd Nedir?
systemd, modern Linux dağıtımlarında servis başlatma, süreç (process) ve kaynak yönetimi yapan bir init (başlatıcı) sistemidir. Systemd, cgroup (kontrol grupları) ve journal (loglama) entegrasyonu ile hizmetleri daha güvenli ve izlenebilir şekilde yönetir. Bu makalede geçen teknik terimlerin Türkçe karşılıkları parantez içinde verilecektir: unit (birim), cgroup (kontrol grubu), socket activation (socket etkinleştirme) vb.
Unit Dosyası Yapısı
Systemd unit dosyaları genellikle /etc/systemd/system veya /lib/systemd/system dizinlerinde bulunur. Bir unit dosyası ini-benzeri bir yapıya sahiptir ve temel bölümleri [Unit], [Service], [Install] şeklindedir.
Temel Bölümler
- Unit: Birimin açıklaması, bağımlılıkları ve hedefleri (target).
- Service: Servisin çalıştırılma şekli, kullanıcı, çalışma dizini ve restart politikaları.
- Install: Birimin enable (etkinleştirme) sırasında hangi hedefe bağlanacağını belirtir.
Örnek Basit Unit
[Unit]
Description=Örnek Node.js Uygulaması
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/index.js
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Bu örnekte Type=simple kullanıldı; farklı tipler için sonraki bölümde detay var.
Service Türleri ve Type Direktifleri
Type direktifi, systemd'ye servisin nasıl başlatıldığını söyler. En sık kullanılan tipler:
- simple: ExecStart süreci başlatılır ve PID file gerektirmez. Basit daemonlar için uygundur.
- forking: Eski stil daemon'lar için; ana süreç fork yapıp arka plana geçer.
- notify: Servis başlangıcını systemd'ye bildirir (libsystemd ile uyumlu uygulamalar).
- oneshot: Kısa süreli görevler için; systemd komutları bekler.
| Type | Açıklama | Ne Zaman Kullanılır |
|---|---|---|
| simple | ExecStart doğrudan çalıştırılır, systemd süreç PID'sini izler. | Node.js, Go, Python gibi tek süreçli uygulamalar. |
| forking | Daemon arka plana fork yapar; PID file kullanmak gerekebilir. | Eski Unix daemon'ları (ör. bazı DB veya özel daemonlar). |
| notify | Servis başarılı başlatıldığında systemd'ye bildirim gönderir. | systemd uyumlu uzun süreli servisler. |
Kaynak Limitleri (Limit, cgroups)
Systemd, cgroups aracılığıyla süreçlere CPU, bellek (RAM) ve I/O limitleri uygulayabilir. En yaygın kullanılan direktiflerden bazıları:
- LimitNOFILE: Açık dosya sayısı limiti (ulimit -n karşılığı).
- LimitNPROC: İşlem (process) sayısı limiti (ulimit -u karşılığı).
- MemoryMax: Birim için maksimum bellek (byte veya MB/GB ile belirtilir).
- CPUQuota: CPU kullanımı yüzdesel limiti (ör. 50% için "50%").
Aşağıda örnek bir yapılandırma görebilirsiniz:
[Service]
ExecStart=/usr/bin/myservice
LimitNOFILE=65536
LimitNPROC=512
MemoryMax=512M
CPUQuota=80%
Bu ayarlar VPS veya VDS üzerinde paylaşımlı ortamlarda bir servisin komşu servisleri etkilemesini engellemek için kritiktir.
Restart Politikaları ve Başarımlı Yeniden Başlatma
Restart direktifi; no, on-success, on-failure, always gibi değerler alır. Bunun yanında RestartSec ile yeniden başlatma gecikmesi ayarlanır. İstenmeyen restart döngülerini önlemek için StartLimitBurst ve StartLimitIntervalSec kullanılır.
| Direktif | Açıklama |
|---|---|
| Restart=on-failure | Hata kodu ile çıkan süreçleri yeniden başlatır. |
| Restart=always | Her durumda (başarıyla da dahil) yeniden başlatır. |
| StartLimitBurst | Kısa zamanda izin verilen maksimum yeniden başlatma sayısı. |
Örnek güvenli restart ayarı:
[Unit]
StartLimitIntervalSec=10
StartLimitBurst=5
[Service]
Restart=on-failure
RestartSec=5s
Pratik Örnekler
Aşağıda farklı senaryolara ait unit örnekleri ve açıklamalar yer almaktadır.
1) Node.js Uygulaması (systemd simple)
[Unit]
Description=MyApp Node.js Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/index.js
Restart=on-failure
RestartSec=10s
LimitNOFILE=10000
MemoryMax=300M
[Install]
WantedBy=multi-user.target
2) Templated Unit (Birden fazla örnek için)
Templated unit'lar %i parametresi ile örneklenir. Örneğin myapp@.service ile myapp@instance1 gibi başlatılabilir.
[Unit]
Description=MyApp Instance %i
[Service]
ExecStart=/usr/bin/myapp --config /etc/myapp/%i.conf
User=myapp
[Install]
WantedBy=multi-user.target
3) Socket Activation Örneği
Socket activation ile systemd, bağlantı geldiğinde servisi başlatabilir; bu yöntem kaynak tasarrufu sağlar.
# myapp.socket
[Unit]
Description=MyApp Socket
[Socket]
ListenStream=9080
[Install]
WantedBy=sockets.target
# myapp.service
[Unit]
Description=MyApp Service
[Service]
ExecStart=/usr/bin/myapp
[Install]
WantedBy=multi-user.target
Güvenlik ve İzolasyon
Systemd, servisleri izole etmek için pek çok direktif sunar. Aşağıdaki ayarlar güvenliği artırır:
- PrivateTmp: Servise özel geçici (tmp) dizini sağlar.
- ProtectSystem: Sistemi salt okunur yapma seçenekleri (full/strict).
- NoNewPrivileges: Servisin yeni ayrıcalık kazanmasını engeller.
- CapabilityBoundingSet: Linux yeteneklerini azaltarak saldırı yüzeyini küçültme.
[Service]
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_CHOWN
Bu ayarlar, paylaşımlı VPS/VDS ortamlarında özellikle önemlidir; kaynaklarınızı güvenli tutarken komşu kullanıcıları da korursunuz.
İzleme ve Log Yönetimi
Log'lar için systemd journal kullanılır. Önemli komutlar:
journalctl -u myapp.service --since "2026-03-01" --no-pager
journalctl -f -u myapp.service
Uzun süreli saklama için journal dosyalarının rotate edilmesi ve merkezi bir log sunucusuna (ör. ELK/Graylog) gönderilmesi tavsiye edilir. Ayrıca servislerin sağlık durumunu izlemek için systemctl is-active myapp veya systemctl status myapp komutları kullanılır.
Sıkça Sorulan Sorular
systemd unit dosyası nereye konulmalı?
Kalıcı değişiklikler için /etc/systemd/system dizinini kullanın. Paketle birlikte gelen orijinal unit'lar genelde /lib/systemd/system içinde olur; burada değişiklik yapmak güncelleme ile üzerine yazılabilir.
Unit değişikliğinden sonra ne yapmalıyım?
Yeni veya değişen unit dosyalarını yüklemek için systemctl daemon-reload çalıştırın, ardından servisleri yeniden başlatın: systemctl restart myapp.
Servisim çok bellek tüketiyorsa ne yapmalıyım?
Önce MemoryMax ile limit belirleyin, ardından OOMPolicy ve log'larda bellek kullanımını izleyin. Gerekirse servis kodunda bellek sızıntısı (memory leak) kontrolü yapın.
Restart döngüsünü nasıl engellerim?
StartLimitIntervalSec ve StartLimitBurst ayarlarını uygulayarak kısa sürede çok sayıda yeniden başlatmayı engelleyebilirsiniz. Ayrıca servis nedenlerinin log ile tespit edilmesi önemlidir.
systemd ile cron yerine timer kullanmalı mıyım?
Timer'lar (zamanlayıcılar) cron'a göre daha iyi entegrasyon ve bağımlılık yönetimi sağlar. Eğer birimlerin birbirine bağımlılığı varsa veya start/stop ile ilişkilendirilmiş görevler varsa .timer kullanmak avantajlıdır.
Sonuç
Bu rehberde systemd ile servis yönetimi, unit dosyası yapısı, kaynak sınırlandırma (cgroups), restart politikaları ve güvenlik ayarları ele alındı. Pratik örnekler sayesinde kendi VPS/VDS ortamınızda (ör. Türkiye VPS Sunucu veya Kiralık Sunucu üzerinde) güvenli ve kararlı servisler çalıştırabilirsiniz. Corelux hizmetleri ile ilgili daha fazla bilgi almak için ilgili sayfalara göz atabilirsiniz.
Uygulama sırasında özel ihtiyaçlarınız olursa Corelux teknik desteği ile iletişime geçmenizi öneririz.
Yazar
Boran BAR