Linux Systemd Servisleri Yönetme
Bir sunucuda çalışan her arka plan işi bir yerden yönetiliyor. Çoğu modern Linux dağıtımında bu yer systemd. Nginx'i yeniden başlatmak, kendi Python botunuzu boot sırasında ayağa kaldırmak veya çöken bir servisin nedenini bulmak — hepsi aynı araç setiyle yapılıyor.
Aşağıdaki adımları kendi makinenizde ya da bir test sunucusunda uygulayabilirsiniz. Terminal kullanımına yeniyseniz temel komutları hatırlatan başlangıç rehberimize göz atmanız işinizi kolaylaştırır.
Günlük Kullanımda systemctl
systemctl systemd'nin ana arayüzü. Servisleri sorgular, durdurur, başlatır ve açılışa ekler. Değişiklik yapan her komut root yetkisi ister, yani başına sudo gelir.
Durumu Okumak
Herhangi bir müdahaleden önce mevcut durumu görün:
- systemctl status nginx — çalışıyor mu, hangi PID ile, son log satırları neler.
- systemctl is-active nginx — sadece "active" veya "inactive" döner. Script içinde kullanmak için ideal.
- systemctl is-enabled nginx — açılışta otomatik başlıyor mu.
- systemctl list-units --type=service — o an yüklü tüm servisler.
- systemctl list-units --type=service --state=failed — sadece patlayanlar. Sorun aramaya buradan başlayın.
Status çıktısındaki Active satırı kritik. "active (running)" sürekli çalışan bir süreç demek. "active (exited)" ise iş bitmiş ve kapanmış demek; bu bir hata değil, tek seferlik görevlerde normal.
Başlatma, Durdurma, Yeniden Yükleme
| Komut | Ne yapar |
|---|---|
| start | Servisi hemen çalıştırır |
| stop | Servisi durdurur |
| restart | Durdurup tekrar başlatır, bağlantılar kopar |
| reload | Süreci kapatmadan yapılandırmayı tazeler |
| reload-or-restart | Reload destekliyorsa onu, desteklemiyorsa restart'ı seçer |
Canlı bir web sunucusunda önce reload deneyin. Kesinti yaşamazsınız. Nginx gibi servislerde ayrıca nginx -t ile konfigürasyonu doğrulayıp öyle reload etmek iyi bir alışkanlık.
Açılışta Otomatik Başlatma
Burada sık karıştırılan bir ayrım var: start şu anı, enable gelecekteki açılışları ilgilendirir.
- systemctl enable app — boot'ta başlasın.
- systemctl enable --now app — hem etkinleştir hem şimdi başlat.
- systemctl disable --now app — hem devre dışı bırak hem durdur.
- systemctl mask app — servisi tamamen kilitler. Başka bir paket bağımlılık olarak çağırsa bile başlayamaz.
- systemctl unmask app — kilidi açar.
Mask'i sadece gerçekten istemediğiniz servisler için kullanın. Unmask etmeyi unutup "servis neden başlamıyor" diye saatlerce aramak klasik bir tuzaktır.
Kendi Servisinizi Yazmak ve Sorunu Bulmak
systemd hizmetleri yalnızca paketlerle gelmez. Kendi scriptinizi de birkaç satırla kalıcı bir servise dönüştürebilirsiniz.
Unit Dosyasının Anatomisi
Kendi yazdıklarınız /etc/systemd/system/ altına gider. Paketlerin kendi dosyaları /lib/systemd/system/ altındadır; oraya dokunmayın, güncellemede üzerine yazılır.
/etc/systemd/system/raporcu.service dosyası şöyle olabilir:
- [Unit] bölümünde Description ve After=network.target. Ağ hazır olmadan başlamasın.
- [Service] bölümünde Type=simple, User=raporcu, WorkingDirectory=/opt/raporcu, ExecStart=/usr/bin/python3 /opt/raporcu/main.py, Restart=on-failure, RestartSec=5.
- [Install] bölümünde WantedBy=multi-user.target. Bu satır olmazsa enable komutu işe yaramaz.
Birkaç kural: ExecStart mutlak yol ister, python3 yazamazsınız. Servis kendi kabuğunu almadığı için PATH ve alias'lar geçerli değildir. Root yerine ayrı bir kullanıcı tanımlamak güvenlik açısından çok daha sağlıklı. Karmaşık başlangıç mantığını doğrudan unit dosyasına sıkıştırmak yerine bir bash scriptine taşıyın; script yazma rehberimizdeki hata yakalama kalıpları burada işe yarar.
Devreye Alma ve Değiştirme
- Dosyayı kaydedin.
- sudo systemctl daemon-reload çalıştırın. Bu adım atlanırsa systemd yeni dosyayı görmez.
- sudo systemctl start raporcu ile deneyin.
- systemctl status raporcu ile doğrulayın.
- Sorun yoksa sudo systemctl enable raporcu.
Hazır bir paketin servisini değiştirmeniz gerekirse dosyayı kopyalamayın. sudo syst