Ücretsiz3 dakikalık yazılım sağlık testi: önce neyi düzeltmeniz gerektiğini görün
Blog

Linux sistemlerde systemd servis dosyası oluşturulması ve servisin açılışta otomatik başlatılması

3 dk okuma
  • Linux
  • systemd
  • Node.js
İçindekiler

systemd üzerine yazılmış birçok kaynak var. Bu da onlardan biri; benim sunucularımda sonuç aldığım yöntemi anlatıyorum.

systemd nedir?

Linux sistemlerin açılışında, sistemin sunacağı hizmetleri başlatan ve yöneten yapıya systemd (system daemon) deniyor. Sistem boot edildiğinde tanımlı servisler başlatılır, her biri kendi PID’i (Process ID) ile izlenir; çöken bir servis istenirse otomatik olarak yeniden başlatılır.

Geliştirdiğimiz uygulamaları mikro servisler halinde küçük parçalara ayırıyoruz. Her bir Node.js modülü bir servisin görevini karşılıyor; modüller event-driven bir yapıda çalışıyor. Alınan veriler kritik ve bir servisin diğerinin işlevini bloklamaması gerekiyor. Her servisi ayrı bir systemd birimi olarak tanımlamak, proje büyüdükçe bakımı ve kontrolü kolaylaştırıyor.

Servis için ayrı bir kullanıcı

Servisi root olarak çalıştırmayın. Bir açık bulunursa saldırgan tüm sisteme erişir. Bunun yerine yalnızca bu iş için, oturum açamayan bir sistem kullanıcısı oluşturun ve uygulamayı /opt altına taşıyın:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin nodeapp
sudo mkdir -p /opt/nodejs-mqtt
sudo chown -R nodeapp:nodeapp /opt/nodejs-mqtt

Servis dosyasını oluşturmak

Kendi servis dosyalarınız /etc/systemd/system altına konur. /lib/systemd/system paket yöneticisine aittir ve güncellemelerde üzerine yazılabilir.

sudo nano /etc/systemd/system/node-device.service
[Unit]
Description=nodejs - micro service device.js
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=nodeapp
WorkingDirectory=/opt/nodejs-mqtt
ExecStart=/usr/bin/node /opt/nodejs-mqtt/device.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

Birkaç not:

  • network-online.target: servis MQTT broker’ına bağlanacağı için ağın gerçekten hazır olmasını bekler. network.target bunu garanti etmez.
  • ExecStart: Node’un tam yolunu which node ile bulun. nvm ile bir kullanıcının ev dizinine kurulan Node, servis kullanıcısı tarafından görülemez; servisler için sistem genelinde kurulu Node kullanın.
  • Loglar için ayrıca ayar gerekmez: systemd, servisin çıktısını varsayılan olarak journal’a yazar.

Servisi başlatmak

systemd’nin yeni dosyayı görmesi için yapılandırmayı yeniden yükleyin, ardından servisi hem şimdi başlatıp hem de açılışta otomatik çalışacak şekilde etkinleştirin:

sudo systemctl daemon-reload
sudo systemctl enable --now node-device
systemctl status node-device

Servis hatasız yapılandırılmışsa çıktıda active (running) görünür. Logları canlı izlemek için:

journalctl -u node-device -f

Bu örneği referans alarak sisteminize istediğiniz kadar servis ekleyebilirsiniz. Çalışan tüm servisleri şu komutla listeleyebilirsiniz:

systemctl list-units --type=service --state=running

Güncelleme notu

Bu yazının ilk hali 2018’de Medium’da yayımlandı. O sürümde servis root olarak, /lib/systemd/system altında ve nvm’e sabitlenmiş bir Node yoluyla çalışıyordu; loglar da artık eskimiş StandardOutput=syslog ayarıyla yönlendiriliyordu. Burada bunları güncel ve güvenli karşılıklarıyla değiştirdim.

Yeni yazılar e-postanıza gelsin

Yeni bir yazı yayımladığımda kısa bir e-posta alırsınız. İstediğiniz zaman tek tıkla çıkabilirsiniz. Gizlilik

İlgili yazılar