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/