Linux Sunucuda Systemd Servis Yazma

Linux sunucularda servis yönetimi, sistem stabilitesi ve otomasyon açısından kritik öneme sahiptir. Systemd, modern Linux dağıtımlarının varsayılan init sistemi olarak, servislerin tanımlanması, başlatılması ve denetlenmesini standartlaştırır. Bu makalede, kendi systemd servis dosyanızı sıfırdan oluşturmayı adım adım ele alacağız. Özellikle geliştiriciler ve sistem yöneticileri için pratik bir rehber sunarak, sunucu ortamlarında özel uygulamaları kalıcı hale getirmenin yollarını açıklayacağız. Bu işlem, manuel script çalıştırmaktan kurtulup, bağımlılık yönetimi ve yeniden başlatma gibi özelliklerden yararlanmanızı sağlar.

Systemd Servis Dosyasının Temel Yapısı

Systemd servis dosyaları, INI benzeri bir sözdizimine sahiptir ve genellikle /etc/systemd/system/ dizinine yerleştirilir. Bu dosyalar üç ana bölümden oluşur: [Unit], [Service] ve [Install]. Her bölüm, servisin davranışını belirleyen anahtar-değer çiftlerini içerir. Doğru yapılandırma, servisin güvenilir çalışmasını sağlar ve hata ayıklamayı kolaylaştırır.

[Unit] bölümü, servisin genel meta verilerini tanımlar. Description ile servis amacını belirtirsiniz, After ile bağımlı servisleri (örneğin network.target) sıralarsınız. Wants veya Requires direktifleri, diğer birimlerin yüklenmesini zorunlu kılar. Bu bölüm, servis başlatma sırasını optimize eder ve çakışmaları önler.

[Service] Bölümünün Detayları

[Service] bölümü, servisin çalışma mantığını belirler. Type=simple en yaygın türdür ve süreç fork etmezse uygundur. ExecStart ile çalıştırılacak komutu tam yol ile belirtin, örneğin ExecStart=/usr/bin/python3 /opt/myapp/app.py. ExecReload ile yeniden yükleme komutunu, Restart=always ile otomatik yeniden başlatmayı etkinleştirin. WorkingDirectory ve Environment gibi direktifler, çalışma dizini ve ortam değişkenlerini ayarlar. Bu ayarlar, uygulamanızın izole ve güvenli çalışmasını temin eder. User ve Group ile belirli bir kullanıcı altında çalıştırma, güvenlik katmanını artırır.

[Install] Bölümünün Kullanımı

[Install] bölümü, servisin sistem başlangıcında etkinleştirilmesini sağlar. WantedBy=multi-user.target ile çok kullanıcılı modda otomatik başlatmayı hedefleyin. Bu bölüm, systemctl enable komutuyla symlink oluşturur. Symlink’ler /etc/systemd/system/multi-user.target.wants/ altına yerleşir ve servis kalıcılığını garanti eder. Yanlış yapılandırma burada sorun yaratabilir, bu yüzden hedefi doğru seçin.

Pratik Örnek: Basit Bir Python Servisi Oluşturma

Şimdi somut bir örnekle ilerleyelim. Diyelim ki bir Python Flask uygulamanız var ve bunu systemd servisi olarak çalıştırmak istiyorsunuz. Önce servis dosyasını oluşturun: sudo nano /etc/systemd/system/myflaskapp.service. Aşağıdaki içeriği ekleyin:

  • [Unit]
    Description=My Flask App
    After=network.target
  • [Service]
    Type=simple
    User=www-data
    WorkingDirectory=/opt/myflaskapp
    Environment=PATH=/usr/bin:/usr/local/bin
    ExecStart=/usr/bin/python3 /opt/myflaskapp/app.py
    Restart=always
  • [Install]
    WantedBy=multi-user.target

Dosyayı kaydettikten sonra sudo systemctl daemon-reload ile systemd’i bilgilendirin. Bu komut, yeni dosyayı tanır ve parse eder. Ardından test edin: sudo systemctl start myflaskapp. Durumu kontrol için sudo systemctl status myflaskapp kullanın; loglar journalctl ile incelenebilir: journalctl -u myflaskapp -f. Hata durumunda, ExecStart yolunu doğrulayın ve izinleri ayarlayın (chmod 755 app.py).

Servisi Yönetme ve İyileştirme Teknikleri

Servis yönetimi komutları standarttır. Etkinleştirmek için sudo systemctl enable myflaskapp, devre dışı bırakmak için disable kullanın. Yeniden başlatma restart, durdurma stop ile yapılır. Mask komutu (systemctl mask) servisi tamamen engeller. İyileştirmeler için LimitNOFILE ile dosya tanımlayıcı limitini artırın veya CPUQuota ile kaynak kısıtlaması ekleyin. Bu, üretim ortamlarında ölçeklenebilirlik sağlar.

Gelişmiş senaryolarda, Type=notify ile servis hazır sinyali gönderin veya ExecStartPre ile ön komutlar çalıştırın (örneğin dizin oluşturma). Güvenlik için PrivateTmp=yes ve ProtectSystem=strict ekleyin; bunlar tmpfs kullanır ve kök dosya sistemini korur. Logrotate entegrasyonu için servis loglarını journal’a yönlendirin. Düzenli testlerle (örneğin smoke test scriptleri), servis güvenilirliğini artırın.

Bu rehberi uygulayarak, Linux sunucularınızda profesyonel systemd servisleri oluşturabilir, bakımını yapabilir ve sorun giderebilirsiniz. Systemd’nin esnekliği sayesinde, karmaşık uygulamaları bile sorunsuz yönetebilirsiniz. Pratiğe dökün, journal loglarını izleyin ve ihtiyaçlarınıza göre özelleştirin; bu yaklaşım, operasyonel verimliliğinizi önemli ölçüde yükseltecektir.