Ana içeriğe geç
Kategoriye Dön

Systemd Servis Yönetimi: start, stop, enable Rehberi

Systemctl komutları, servis unit dosyaları, özel servis oluşturma, journalctl ile log takibi ve systemd sorun giderme rehberi. Linux sunucularda servis yönetimini öğrenin.

Okuma süresi: 12 dk Sunucu Yönetimi
systemdsystemctlservislinuxjournalctlunit filedaemon

İçindekiler

Systemd Servis Yönetimi: start, stop, enable Rehberi

Systemd, modern Linux dağıtımlarının büyük çoğunluğunda kullanılan init sistemi ve servis yöneticisidir. Ubuntu, Debian, CentOS, AlmaLinux ve RHEL gibi dağıtımlarda systemd, sistem başlangıcından servis yönetimine kadar pek çok görevi üstlenir. Bu rehberde systemctl komutlarını, unit dosyalarını ve özel servis oluşturmayı öğreneceksiniz.

Systemd Nedir?

Systemd, Linux çekirdeği başladıktan sonra devreye giren ilk süreçtir (PID 1). Görevleri şunlardır:

  • Sistem servislerini başlatmak ve durdurmak
  • Servisler arasındaki bağımlılıkları yönetmek
  • Sistem loglarını toplamak (journald)
  • Sistem durumunu izlemek

Systemd, eski SysV init sisteminin yerini almıştır. /etc/init.d/ betikleri hâlâ çalışsa da artık systemd unit dosyaları tercih edilmektedir.

Temel systemctl Komutları

Servis Durumu Kontrolü

hljs bash
# Servis durumunu görüntüle
sudo systemctl status nginx

# Servisin çalışıp çalışmadığını kontrol et
sudo systemctl is-active nginx

# Servisin etkin (enabled) olup olmadığını kontrol et
sudo systemctl is-enabled nginx

# Tüm çalışan servisleri listele
sudo systemctl list-units --type=service --state=running

# Başarısız servisleri listele
sudo systemctl list-units --type=service --state=failed

Servis Başlatma ve Durdurma

hljs bash
# Servisi başlat
sudo systemctl start nginx

# Servisi durdur
sudo systemctl stop nginx

# Servisi yeniden başlat (durdur + başlat)
sudo systemctl restart nginx

# Servisi yeniden yükle (yapılandırmayı yenile, durdurmadan)
sudo systemctl reload nginx

# Mümkünse reload, değilse restart yap
sudo systemctl reload-or-restart nginx

Servis Etkinleştirme ve Devre Dışı Bırakma

hljs bash
# Servisi sistem başlangıcında otomatik başlat
sudo systemctl enable nginx

# Servisi başlat ve otomatik başlatmayı etkinleştir
sudo systemctl enable --now nginx

# Otomatik başlatmayı devre dışı bırak
sudo systemctl disable nginx

# Servisi durdur ve devre dışı bırak
sudo systemctl disable --now nginx

# Servisi tamamen maskele (başlatılamaz hale getir)
sudo systemctl mask nginx

# Maskelemeyi kaldır
sudo systemctl unmask nginx

Systemd Unit Dosyaları

Unit dosyaları, systemd'nin servisleri nasıl yöneteceğini tanımlar. İki ana konum vardır:

  • /lib/systemd/system/ — Paket yöneticisi tarafından kurulan unit dosyaları
  • /etc/systemd/system/ — Sistem yöneticisi tarafından oluşturulan/özelleştirilen unit dosyaları
hljs bash
# Bir servisin unit dosyasını görüntüle
sudo systemctl cat nginx

# Unit dosyasının konumunu bul
sudo systemctl show nginx --property=FragmentPath

# Tüm unit dosyalarını listele
sudo systemctl list-unit-files --type=service

Unit Dosyası Yapısı

Bir .service unit dosyası üç ana bölümden oluşur:

hljs ini
[Unit]
Description=Nginx HTTP Server
After=network.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[Unit] Bölümü:

  • Description: Servis açıklaması
  • After: Bu servis hangi servislerden sonra başlamalı
  • Requires: Zorunlu bağımlılıklar
  • Wants: İsteğe bağlı bağımlılıklar

[Service] Bölümü:

  • Type: Servis tipi (simple, forking, oneshot, notify, dbus)
  • ExecStart: Servisi başlatan komut
  • ExecStop: Servisi durduran komut
  • Restart: Yeniden başlatma politikası
  • User/Group: Servisi çalıştıracak kullanıcı

[Install] Bölümü:

  • WantedBy: Hangi target'a bağlı olduğu

Özel Servis Oluşturma

Kendi uygulamanız için bir systemd servisi oluşturmak oldukça basittir.

Örnek: Node.js Uygulaması için Servis

hljs bash
# Unit dosyasını oluştur
sudo nano /etc/systemd/system/myapp.service
hljs ini
[Unit]
Description=My Node.js Application
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/app.js
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
Environment=NODE_ENV=production
Environment=PORT=3000

[Install]
WantedBy=multi-user.target
hljs bash
# Systemd'yi yeni unit dosyasından haberdar et
sudo systemctl daemon-reload

# Servisi başlat ve etkinleştir
sudo systemctl enable --now myapp

# Durumu kontrol et
sudo systemctl status myapp

Örnek: Python Script için Servis

hljs ini
[Unit]
Description=My Python Script
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/myscript
ExecStart=/usr/bin/python3 /home/ubuntu/myscript/main.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Servis Tiplerini Anlamak

TipAçıklamaKullanım Alanı
simpleAna süreç doğrudan çalışırNode.js, Python
forkingAna süreç fork eder ve çıkarNginx, Apache
oneshotTek seferlik görevBaşlangıç scriptleri
notifyHazır olduğunda bildirim gönderirSystemd-aware uygulamalar

Journalctl ile Log Yönetimi

Systemd'nin log sistemi journald, tüm servis loglarını merkezi olarak toplar.

hljs bash
# Tüm logları görüntüle
sudo journalctl

# Belirli bir servisin loglarını görüntüle
sudo journalctl -u nginx

# Son 50 satırı görüntüle
sudo journalctl -u nginx -n 50

# Gerçek zamanlı log takibi
sudo journalctl -u nginx -f

# Son 1 saatin logları
sudo journalctl -u nginx --since "1 hour ago"

# Belirli tarih aralığı
sudo journalctl -u nginx --since "2024-01-01" --until "2024-01-02"

# Sadece hata logları
sudo journalctl -u nginx -p err

# Boot logları
sudo journalctl -b

# Önceki boot'un logları
sudo journalctl -b -1

# Log boyutunu kontrol et
sudo journalctl --disk-usage

# Eski logları temizle (2 haftadan eski)
sudo journalctl --vacuum-time=2weeks

Systemd Target'ları

Target'lar, birden fazla servisi gruplandıran özel unit dosyalarıdır.

hljs bash
# Mevcut target'ı görüntüle
sudo systemctl get-default

# Target'ı değiştir
sudo systemctl set-default multi-user.target

# Mevcut oturumu değiştir (reboot gerektirmez)
sudo systemctl isolate rescue.target

# Yaygın target'lar
# poweroff.target  — Sistemi kapat
# rescue.target    — Tek kullanıcı modu
# multi-user.target — Çok kullanıcılı, ağ aktif
# graphical.target — Masaüstü ortamı

Sorun Giderme

Servis Başlamıyor

hljs bash
# Detaylı durum bilgisi
sudo systemctl status myapp -l

# Son logları incele
sudo journalctl -u myapp -n 100 --no-pager

# Unit dosyasını doğrula
sudo systemd-analyze verify /etc/systemd/system/myapp.service

# Bağımlılık sorunlarını kontrol et
sudo systemctl list-dependencies myapp

Daemon-reload Unutuldu

hljs bash
# Unit dosyasını değiştirdikten sonra mutlaka çalıştırın
sudo systemctl daemon-reload

Servis Sürekli Yeniden Başlıyor

hljs bash
# Restart politikasını kontrol et
sudo systemctl show myapp --property=Restart

# Restart sayacını sıfırla
sudo systemctl reset-failed myapp

Bir servisi geliştirirken önce Type=simple ve Restart=on-failure ile başlayın. Servis kararlı hale geldikten sonra diğer ayarları optimize edin.

Systemd Timer'ları (Cron Alternatifi)

Systemd timer'ları, cron job'larına modern bir alternatif sunar.

hljs bash
# Timer unit dosyası oluştur
sudo nano /etc/systemd/system/backup.timer
hljs ini
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
hljs bash
# Timer'ı etkinleştir
sudo systemctl enable --now backup.timer

# Tüm timer'ları listele
sudo systemctl list-timers

Sonuç

Systemd, modern Linux sunucu yönetiminin temel taşıdır. Systemctl komutlarını ve unit dosyası yapısını öğrenmek, sunucunuzdaki servisleri güvenilir şekilde yönetmenizi sağlar. REXE sunucularında özel servisler oluşturarak uygulamalarınızın sistem yeniden başlatmalarında otomatik olarak devreye girmesini sağlayabilirsiniz.