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

Reboot Sonrası Servis Başlatma Sorunları

Sunucu yeniden başlatma sonrası servis başlatma sorunlarını teşhis ve çözme: systemctl, failed services, boot log analizi ve systemd yapılandırması.

Okuma süresi: 11 dk Sorun Giderme
rebootsystemctlservisbootbaşlatmasystemd

İçindekiler

Giriş

Sunucu yeniden başlatıldıktan sonra bazı servisler otomatik olarak başlamayabilir, bu da kesintilere ve hizmet aksamalarına neden olur. Bu rehberde, reboot sonrası servis başlatma sorunlarını teşhis etmeyi ve çözmeyi öğreneceksiniz.

Başarısız Servisleri Kontrol Etme

Başarısız Servisleri Listeleme

hljs bash
# Tüm başarısız servisleri listele
sudo systemctl list-units --type=service --state=failed

# Belirli bir servisin durumunu kontrol et
sudo systemctl status SERVIS_ADI

# Tüm servisleri ve durumlarını göster
sudo systemctl list-units --type=service --all

Boot Loglarını Okuma

hljs bash
# Mevcut boot loglarını görüntüle
journalctl -b

# Önceki boot loglarını görüntüle
journalctl -b -1

# Servise göre filtrele
journalctl -b -u SERVIS_ADI

# Sadece hataları göster
journalctl -b -p err

# Boot süresi analizi
systemd-analyze

# Servis başlatma sırası
systemd-analyze blame

# Kritik zincir
systemd-analyze critical-chain

systemd-analyze blame hangi servislerin başlatılmasının en uzun sürdüğünü gösterir. Bu, boot sürecindeki darboğazları belirlemeye yardımcı olur.

Servisleri Otomatik Başlatma İçin Etkinleştirme

Boot'ta Servis Etkinleştirme

hljs bash
# Servisi boot'ta başlatmak için etkinleştir
sudo systemctl enable SERVIS_ADI

# Etkinleştir ve hemen başlat
sudo systemctl enable --now SERVIS_ADI

# Servisin etkin olup olmadığını kontrol et
systemctl is-enabled SERVIS_ADI

# Tüm etkin servisleri listele
systemctl list-unit-files --type=service --state=enabled

Yaygın Etkinleştirilmesi Gereken Servisler

hljs bash
# SSH sunucusu
sudo systemctl enable ssh

# Nginx web sunucusu
sudo systemctl enable nginx

# Apache web sunucusu
sudo systemctl enable apache2

# MySQL/MariaDB
sudo systemctl enable mysql

# Docker
sudo systemctl enable docker

# Fail2Ban
sudo systemctl enable fail2ban

Servis Bağımlılıkları

Bağımlılıkları Anlama

hljs bash
# Servis bağımlılıklarını göster
systemctl list-dependencies SERVIS_ADI

# Ters bağımlılıkları göster
systemctl list-dependencies --reverse SERVIS_ADI

# Servis unit dosyasını göster
systemctl cat SERVIS_ADI

Unit Dosyalarında Bağımlılık Yapılandırma

hljs ini
# /etc/systemd/system/myapp.service
[Unit]
Description=Uygulama Servisi
After=network.target mysql.service
Requires=mysql.service
Wants=redis.service

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Önemli direktifler:

  • After=: Bu birimlerden sonra başlat
  • Requires=: Zorunlu bağımlılık (bağımlılık başarısız olursa başarısız olur)
  • Wants=: Yumuşak bağımlılık (bağımlılık başarısız olsa da devam eder)
  • Before=: Bu birimlerden önce başlat

Boot Sırası Analizi

hljs bash
# Tam boot süresi
systemd-analyze time

# Servis başlatma süreleri (sıralı)
systemd-analyze blame | head -20

# Kritik zincir görselleştirme
systemd-analyze critical-chain

# SVG boot grafiği oluşturma
systemd-analyze plot > boot-chart.svg

Boot süresi çok uzunsa, gereksiz servisleri sudo systemctl disable SERVIS_ADI ile devre dışı bırakmayı düşünün.

Özel Systemd Servisi Oluşturma

hljs bash
# Servis dosyası oluşturma
sudo nano /etc/systemd/system/myapp.service
hljs ini
[Unit]
Description=Özel Uygulama
After=network.target

[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start
ExecStop=/opt/myapp/bin/stop
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
hljs bash
# Systemd daemon'ı yeniden yükle
sudo systemctl daemon-reload

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

# Durumu kontrol et
sudo systemctl status myapp

Yaygın Sorunları Giderme

Servis Hata Kodu ile Başarısız Oluyor

hljs bash
# Detaylı hatayı kontrol et
journalctl -u SERVIS_ADI -n 50 --no-pager

# Servis yapılandırmasını kontrol et
systemctl cat SERVIS_ADI

# Binary'nin var olduğunu ve çalıştırılabilir olduğunu doğrula
ls -la /path/to/binary

Servis Çok Erken Başlıyor

hljs bash
# Ağ bağımlılığı ekle
[Unit]
After=network-online.target
Wants=network-online.target

# network-online target'ı etkinleştir
sudo systemctl enable systemd-networkd-wait-online

Servis Sürekli Yeniden Başlıyor

hljs bash
# Yeniden başlatma sayısını kontrol et
systemctl show SERVIS_ADI -p NRestarts

# Son logları görüntüle
journalctl -u SERVIS_ADI --since "5 minutes ago"

# Yeniden başlatma döngüsünü geçici olarak durdur
sudo systemctl stop SERVIS_ADI
sudo systemctl reset-failed SERVIS_ADI

rc.local Alternatifi

Basit başlatma komutları için rc.local yerine systemd servisi oluşturun:

hljs ini
# /etc/systemd/system/rc-local.service
[Unit]
Description=RC Local Uyumluluğu
After=network.target

[Service]
Type=oneshot
ExecStart=/etc/rc.local
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
hljs bash
# rc.local'ı çalıştırılabilir yap
sudo chmod +x /etc/rc.local

# Servisi etkinleştir
sudo systemctl enable rc-local

Sonuç

Reboot sonrası servis başlatma sorunları yaygın ama kolayca önlenebilir. Kritik servislerin systemctl enable ile etkinleştirildiğinden emin olun, unit dosyalarında doğru bağımlılıkları yapılandırın ve düzenli olarak boot loglarını hatalara karşı kontrol edin.