systemd servisi başlamıyor: systemctl status ve journalctl ile hata bulma
Bir servisi başlatmaya çalışıyorsunuz ve systemctl start uygulama ya hata veriyor ya da servis "failed" durumuna düşüyor. Doğru yaklaşım tahmin etmek değil, sistemin kaydettiği hatayı okumaktır. İki komut hemen her sorunu açıklar.
1. Durumu görün
systemctl status uygulama
Çıktıdaki Active: satırı durumu söyler: active (running) çalışıyor, failed başarısız, activating (auto-restart) sürekli çöküp yeniden başlıyor demektir. Altında son birkaç günlük satırı ve Process: ... status=203/EXEC gibi bir çıkış kodu bulunur.
2. Tam günlüğü okuyun
sudo journalctl -u uygulama -n 50 --no-pager
sudo journalctl -xeu uygulama
İlk komut servisin son 50 satırını, ikincisi (-xe) ayrıntılı açıklamalı son kayıtları gösterir. Bir sonraki denemeyi izlemek için ayrı bir pencerede sudo journalctl -fu uygulama çalıştırın (-f canlı akış). Programın kendi hata çıktısı genellikle buraya düşer.
Çıkış koduna göre sebepler
- 203/EXEC: systemd
ExecStartsatırındaki programı çalıştıramadı. Dosya yok, yol yanlış, dosyanın çalıştırma izni yok (chmod +x) ya da betiğin ilk satırı (#!/usr/bin/env python3) hatalı. Yolu elle kontrol edin:ls -l /srv/uygulama/venv/bin/gunicorn. - 217/USER: Servis dosyasında belirtilen
User=sistemde yok.getent passwd www-dataile kullanıcıyı kontrol edin. - 200/CHDIR:
WorkingDirectoryklasörü yok ya da erişilemiyor. - 1 ya da 2: Program kendisi hatayla çıktı. Günlükteki mesaj nedenini yazar (eksik paket, hatalı ayar, kullanılan port).
- "Address already in use": Port zaten kullanımda:
sudo ss -tlnp | grep 8000. - "Permission denied": Kullanıcının dosya ya da klasöre erişim izni yok. Sahibi ve izinleri düzeltin: dosya izinleri.
- Sürekli yeniden başlıyor:
Restart=on-failureile döngüye girmiş olabilir. Bir sınır aşılınca systemd "start request repeated too quickly" der; hatayı düzeltipsudo systemctl reset-failed uygulamaile sayacı sıfırlayın.
Servis dosyasını denetleyin
systemd-analyze verify /etc/systemd/system/uygulama.service
Bu komut söz dizimi hatalarını ve eksik yolları, servisi başlatmadan bildirir (ör. "Command ... is not executable: No such file or directory"). Dosyayı her değiştirdiğinizde sudo systemctl daemon-reload çalıştırmayı unutmayın; aksi halde systemd eski halini kullanır.
Elle çalıştırarak deneyin
Servisi çalıştıran kullanıcıyla komutu elle çalıştırmak çoğu zaman hatayı doğrudan ekrana basar:
sudo -u www-data /srv/uygulama/venv/bin/gunicorn --bind 127.0.0.1:8000 uygulama:app
Elle çalışıp serviste çalışmıyorsa fark ortam değişkenlerinde (servis temiz bir ortamla başlar), çalışma klasöründe ya da kullanıcı izinlerindedir. Servis yazımı için örnek: Gunicorn ve systemd. Sunucu açılışında servisin başlaması için sudo systemctl enable uygulama gerekir.
Sık sorulanlar
journalctl hiçbir şey göstermiyor.
Yetkisiz kullanıcı yalnızca kendi kayıtlarını görür; sudo kullanın. Kalıcı günlük kapalıysa yeniden başlatma sonrası eski kayıtlar silinir: sudo mkdir -p /var/log/journal.
Servis çalışıyor ama uygulama cevap vermiyor.
Port ya da bağlama adresi (127.0.0.1 ya da 0.0.0.0) yanlış olabilir; ss -tlnp ile kontrol edin ve güvenlik duvarına bakın.
Eski bir servis dosyasını silemiyorum.
Dosyayı silin, sudo systemctl daemon-reload ve sudo systemctl reset-failed çalıştırın. Etkin bağlantı için önce sudo systemctl disable --now adi.
İlgili makaleler
- Python Flask ya da Django uygulamasını Gunicorn ve systemd ile yayınlama
- Bir programı arka planda sürekli çalıştırma (screen, systemd)
- Nginx 502 Bad Gateway hatası: nedenleri ve çözümü
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!