Linux'ta Servis Oluşturma - Systemd

  1. Dilediğin dilde bir program yaz.
  2. Bu program  long-running (sürekli/uzun süre çalışan) olsun.
  3. Systemd kullanarak bu programı bir servise dönüştür.

İşte Linux'ta servis oluşturmak bu kadar basit. Bu yazımda Node.js kullanarak yazdığım ufak bir yardımcı programı servise çevireceğim. Bu servisin amacı;

  1. Http Get request yaparak belirli adreslerin ulaşılabilir olduğunu test et,
  2. Eğer bu adresler ulaşılamaz ise, verilen email adreslerine e-posta gönder.

Yani, bir servisin/API'nin çalışıp çalışmadığını kontrol eden bir program yazıyoruz ve bu programı systemd kullanarak arka planda sürekli çalışan bir servise çeviriyoruz.

Programın kodlarına github'tan ya da npmjs'ten ulaşabilirsiniz. Bu yazımın amacı bu kodu systemd kullanarak nasıl bir servise çevireceğimiz olduğundan dolayı kodlamaya girmeyeceğim.

Systemd Nedir?

Aslında her şey Lennart Poettering'in bu blog yazısıyla başladı. Kısaca, systemd linux işletim sisteminde servis ve sistemlerin çalışmalarını organize etmekle sorumludur. Önceki init sistemde, servisler boot sırasında birbirlerini bağımlılıktan dolayı beklediğinden ve bu süresel ve kaynaksal maliyete yol açtığından dolayı systemd yazılmıştır. Bu sistem ve servisler birbirleriyle soketler aracılığıyla haberleşir. Systemd, servislerin ihtiyaç duyduğu soketleri, ilgili servis başlamasa dahi önceden başlatma ve diğer bekleyen servislerin sırada beklemesini engelleme konseptiyle yazılmıştır. Neden böyle bir yapıya geçildiğini daha detaylı öğrenmek ve systemd'nin çalışma prensibini tam anlamıyla anlayabilmek için yukarıdaki yazıyı okuyabilirsiniz.

Ben systemd'yi yukarıda paylaştığım projeyi bir servise çevirip, sistemle birlikte otomatik olarak başlatılmasını ve arka planda sürekli çalışmasını istediğim için kullanacağım.

Hadi bir terminal açalım ve;

$ cd /etc/systemd/system/
// yukarıdaki komut ile servis konfigürasyon dosyasını oluşturacağımız yere gidelim.
$ nano is.api.up.service
// komutu ile is.api.up adıyla bir servis dosyası oluşturalım ve içeriği aşağıdaki gibi olsun.
[Unit]
Description=Api health checker
After=network.target

[Service]
User=demiremrece
Environment=localhost
WorkingDirectory=/home/is-api-up
ExecStart=/usr/bin/node index.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
// Artık tekrar komut satırına gelip, aşağıdaki komutu yazdığımızda servisimiz başlatılacak.
$ systemctl start is.api.up.service
// Ve sistem açılışında otomatik başlaması için de;
$ systemctl enable is.api.up.service

Şimdi ise konfig dosyasındaki parametrelerin ne anlama geldiğine ve diğer ekleyebileceğimiz parametrelere göz atalım.

  • After=
    Bu parametre servisin hangi diğer servisten sonra başlatılmak istendiğini belirtmek için kullanılır.
  • User=
    Sistemdeki kullanıcı adınız.
  • Environment=
    Çalışma ortamı.
  • WorkingDirectory=
    Projemizin bulunduğu directory
  • ExecStart=
    Projeyi çalıştırmak için komut. Node.js ile yazıldığından ana scripti(index.js) node ile çalıştırıyoruz.
  • Restart=
    Systemd varsayılan olarak servisimizi bir hata durumunda yeniden başlatmaz. Biz servisin her zaman erişilebilir olmasını istediğimizden dolayı burayı always yapabiliriz. on-failure sadece hata durumunda yeniden başlatır. Ama sistem "exit status code:0" ile de sonlanabilir. Bu success kodudur. Detaylı bilgi için: systemd status kodları

Systemd hakkında daha detaylı bilgi için buraya bakabilirsiniz.

Son olarak da aşağıdaki komutları kullanarak servisleri yönetebilirsiniz.

# systemctl start | stop | restart | reload | status servisinizinadi.service