Kısa cevap
Bir systemd servisi başlatılamadığında, önce `systemctl status servis-adi` komutuyla durumu kontrol edin ve `journalctl -u servis-adi` ile günlükleri inceleyin. Nedeni yapılandırma hatası, eksik dosya, yanlış izinler veya başarısız bir bağımlılık olabilir. Sistematik teşhis için adımları izleyin.
Sorun nasıl anlaşılır
- Servis failed veya inactive durumunda
- Servisi başlatmak hata döndürüyor
- Servis başlıyor ve hemen çöküyor
- Bağlantı noktasındaki uygulama yanıt vermiyor
- Günlüklerde hata mesajları görünüyor
En yaygın nedenler
Servis yapılandırma hatası
Geçersiz unit dosyası, yürütülebilir dosyaya yanlış yol veya eksik parametreler başlatmayı engeller.
Eksik izinler veya sahiplik
Servisin yapılandırmayı okuma, dizine yazma veya ağa erişme hakkı olmayabilir.
Bağımlılık karşılanmıyor
Servis, başlatma anında kullanılamayan başka bir servise, ağa veya disk bağlamasına bağımlıdır.
Bağlantı noktası meşgul
Başka bir uygulama, servisin kullanmaya çalıştığı bağlantı noktasını zaten kullanıyor.
Eksik dosyalar veya kitaplıklar
Yürütülebilir dosya, yapılandırma dosyası veya paylaşılan kitaplık beklenen konumda yok.
Adım adım çözüm
- 1
Servis durumunu kontrol edin
systemctl status servis-adikomutunu çalıştırın. Duruma (failed, inactive) ve son hata mesajlarına dikkat edin. Durum genellikle nedenin ilk ipucunu verir. - 2
Günlükleri inceleyin
Ayrıntılı günlükler için
journalctl -u servis-adi -xekullanın.-eseçeneği sona atlar,-xaçıklamalar verir. Servis yakın zamanda çöktüyse--since "10 min ago"ekleyin. - 3
Unit dosyasını kontrol edin
Unit dosyasının içeriğini görmek için
systemctl cat servis-adikomutunu çalıştırın. Yürütülebilir dosya ve yapılandırma yollarının doğru olduğundan ve sözdizimi hatası olmadığından emin olun. - 4
Yürütülebilir dosyayı elle test edin
ExecStartiçindeki komutu,User=ile belirtilen kullanıcı olarak elle çalıştırın. Elle çalışıyorsa sorun servis ortamındadır (değişkenler, izinler). - 5
İzinleri ve sahipliği kontrol edin
Servis kullanıcısının gerekli dizinlerde okuma ve yazma hakkı olduğundan emin olun. Yolu kontrol etmek için
ls -lvenamei -lkullanın. - 6
Bağımlılıkları kontrol edin
systemctl list-dependencies servis-adikomutunu çalıştırın. Tüm bağımlılıkların etkin olduğundan emin olun. Bağımlı servisi elle başlatıp yeniden deneyebilirsiniz. - 7
Bağlantı noktasının meşgul olup olmadığını kontrol edin
Bağlantı noktasını hangi sürecin tuttuğunu görmek için
sudo ss -tulnp | grep :PORTkullanın. Meşgulse, hangi süreç olduğunu kontrol edin ve yalnızca güvenliyse durdurun veya yapılandırmada bağlantı noktasını değiştirin. - 8
Systemd'yi yeniden yükleyin ve servisi başlatın
Unit dosyasını değiştirdikten sonra
systemctl daemon-reload, ardındansystemctl start servis-adikomutunu çalıştırın. Durumu tekrar kontrol edin.
Hiçbir şey işe yaramazsa
Servis hala başlatılamıyorsa, bir kaynak sınırlaması (ör. LimitNOFILE) veya SELinux/AppArmor olup olmadığını kontrol edin. SELinux'u test ediyorsanız, yalnızca test sisteminde geçici olarak permissive moda alın (setenforce 0) ve hemen enforcing moda döndürün (setenforce 1); üretim sisteminde korumayı kalıcı olarak kapatmayın. Ayrıca servisle doğrudan ilgili olmayan hatalar için sistem günlüklerine (journalctl -b) bakın. Karmaşık durumlar için ExecStart komutunu strace -f altında çalıştırarak nerede durduğunu görün.
Tekrarlanmaması için
- Systemd ve servisleri düzenli olarak güncelleyin
- Unit dosyalarını kontrol etmek için `systemd-analyze verify` kullanın
- Kritik servisler için izleme kurun
- Yapılandırma değişikliklerinin kaydını tutun
Ne zaman uzmana başvurmalı
Tüm adımları denediyseniz ve servis hala çalışmıyorsa veya root hesabına erişiminiz yoksa, BT desteğine başvurun. Sistemi daha derinlemesine analiz edebilir ve gelişmiş teknikleri güvenli bir şekilde uygulayabilirler.
BT altyapı bakımı · Sunucular, ağlar, yedekleme, güvenlik ve yardım masasıSık sorulan sorular
Bir servisin tüm günlüklerini nasıl görürüm?
Tüm kayıtları görmek için `journalctl -u servis-adi` komutunu `-e` seçeneği olmadan kullanın. Günlükleri gerçek zamanlı izlemek için `-f` ekleyebilirsiniz.
"status=203/EXEC" hatası ne anlama gelir?
Systemd'nin `ExecStart` içindeki komutu yürütemediğini gösterir. Yolu, izinleri ve dosyanın var olup olmadığını kontrol edin.
Servisin çalıştığı kullanıcıyı nasıl değiştiririm?
Unit dosyasındaki `User=` değerini değiştirin (en iyisi `systemctl edit servis-adi` ile), ardından `systemctl daemon-reload` çalıştırın ve servisi yeniden başlatın.