swetrix
systemd

Linux’da systemd servisi nasıl oluşturulur ?

systemd artık neredeyse tüm Linux dağıtımlarında kullanılıyor. Elbette, systemd dışında farklı bir init sisteminin kullanan Linux dağıtımları vardır, ancak bunlar çok nadirdir. Ubuntu, Fedora, RHEL, Debian, Pop!_OS, Arch hepsi varsayılan olarak systemd ile birlikte gelir.

systemd çok yaygın olarak kullanıldığından, bir systemd servisinin nasıl oluşturulacağını ele alacağız.

systemd servisi nedir ?

Basitçe söylemek gerekirse, bir servis, belirli koşullara göre başlatılan veya durdurulan bir işlem veya işlem gruplarıdır. Manuel olarak başlatmanız ve/veya durdurmanız gerekmez. Bir systemd servis dosyası, systemd’nin onu anlayabileceği ve daha sonra yapmasını söylediğiniz şeyi yapabileceği bir biçimde yazılmış bir dosyadır.

Bir systemd hizmet dosyasını inceleyelim

systemd servis dosyasının üç önemli ve gerekli bölümü vardır. Bunlar [Unit], [Service] ve [Install] bölümleridir. systemd servis dosyasının uzantısı .service’dir ve tek satırlık yorumlar için hash sembolünü (#) kullanırız. Aşağıda bir systemd hizmet dosyası örneği verilmiştir. Bu servis dosyası nginx’e aittir.

# nginx signals reference doc:
# http://nginx.org/en/docs/control.html

[Unit]
Description=A high performance web server and a reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Şimdi bu bölümleri ve ne işe yaradıklarını inceleyelim.

1. Unit bölümü

Unit bölümü, servisin kendisiyle ilgili ayrıntıları ve açıklamayı içerir. Bu bölümde “Description”, “After” ve Before parametreleri kullanılır.

  • 1.1 Description
  • 1.2 After
  • 1.3 Before

Description : Servis ile ilgili genel bir açıklama sağlar.
After : Servisin başka bir servise bağımlılığı var ise bağımlı olduğu servisin berlitileceği bölüm. Örneğimizde Nginx servisi başlamak için network servisini bağımlılık belirlemiş. Network servisi çalışmadan nginx servisi başlatılmaz.
Before : Servise bağımlılığı olan başka bir servis var ise burada belirtilir. Örneğin web uygulamanız için bir servisiniz var ve uygulamanızı nginx serve ediyor. Bu durumda nginx’in web uygulamanızdan önce çalışması gerekir. Bu gibi durumlarda “Before” parametresi kullanılır.

2. Service bölümü

Service bölümü, servisin nasıl başlatılacağı, nasıl durdurulacağı gibi parametreleri içerir.

  • 2.1 ExecStart
  • 2.2 ExecReload
  • 2.3 Type
  • 2.4 Restart

ExecStart: Servis başladığında yürütülmesi gereken komut.
ExecReload : Bu isteğe bağlı bir alandır. Bir servisin nasıl yeniden başlatılacağını belirtir.
Type : Bu, belirli bir sistem hizmeti için bir işlemin başlangıç türünü gösterir. Parametreler simple, exec, forking, oneshot, dbus, notify ve idle’dır.
Restart : Bu başka bir isteğe bağlı alandır, ancak büyük olasılıkla kullanacağınız bir alandır. Koşullara bağlı olarak bir servisin yeniden başlatılıp başlatılmayacağını belirtir. Kullanılabilir parametreler no, on-success, on-failure and always. Örneğin “always” parametresini kullanırsanız servisin ne zaman hata verirse yada başarılı bir şekilde işini yapıp durursa, always parametresi servisi restart eder.

3. Install bölümü

Install bölümü, adından da anlaşılacağı gibi bir sistemd servis dosyasının kurulumunu gerçekleştirir. Bu, bir hizmeti etkinleştirmek veya devre dışı bırakmak için “systemctl enable” ve “systemctl disable” komutunu çalıştırdığınızda kullanılır.

  • 3.1 WantedBy
  • 3.2 RequiredBy

WantedBy : Unit bölümünde kullandığımız “Before”, “After” parametrelerine çok benzer fakat tek tek servis bazında değilde “runlevel” bazında belirleriz. Örneğimizde “multi-user.target” kullanılmıştır. Bu “runlevel” parametresi biraz derin ve kompleksdir. Konsepti anlayabilmeniz için “runlevel” listeleyen bir komut çalıştırdım çıktısı aşağıdadır. Göz attığınızda biraz daha basit ve anlaşılabilir. Genelde “multi-user.target” run levelini kullanırız.

ls -al /lib/systemd/system/runlevel*
lrwxrwxrwx 1 root root   15 Sep  8 12:58 /lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx 1 root root   13 Sep  8 12:58 /lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx 1 root root   17 Sep  8 12:58 /lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root   17 Sep  8 12:58 /lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root   17 Sep  8 12:58 /lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx 1 root root   16 Sep  8 12:58 /lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx 1 root root   13 Sep  8 12:58 /lib/systemd/system/runlevel6.target -> reboot.target

Kendi servisinizi oluşturun

Kendi servis dosyanızı yukarda verilen parametrelerle doğru bir şekilde yapılandırdıktan sonra dosyanızı /etc/systemd/system altına kopyalayın. Servis dosyanızın uzantısı .service olmalıdır.
Dosyayı kopyaladıktan sonra systemd nin değişiklikleri okuyabilmesi için aşağıdaki komut çalıştırılır.

sudo systemctl daemon-reload

Servisinizin başlangıçta çalışması için:

systemctl enable SERVICE-NAME.service

Servisinizn başlangıçta çalışmasını iptal etmek için :

systemctl disable SERVICE-NAME.service

Servisiniz başlatmak için :

systemctl start SERVICE-NAME.service

Aklınıza takılan sorular veya danışmak istediğiniz bir konu olursa yorumlara yazabilirsiniz.

Kaynak:
https://systemd.io/
https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Önceki Yazı
patroni_postgresql_haproxy

Patroni ile Postgresql HA Cluster Kurulumu – Ubuntu 20.04

Sonraki Yazı
cassandra-cluster

Cassandra Cluster Kurulumu – Ubuntu 22.04

Benzer Yazılar