Systemd'de Yeni Hizmet Birimleri Nasıl Oluşturulur ve Çalıştırılır


Birkaç gün önce Centos 8 32 bitlik bir dağıtımla karşılaştım ve onu eski bir 32 bitlik makinede test etme isteği duydum. Önyüklemeden sonra bir hata olduğunu ve ağ bağlantısını kaybettiğini fark ettim ve önyüklemeden sonra her seferinde bunu manuel olarak "açmak" zorunda kaldım. Öyleyse soru şuydu: Makinemi her başlattığımda çalışacak şekilde bu işi yapacak bir komut dosyasını nasıl ayarlayabilirim?

Aslında bu çok basit ve size servis birimlerini kullanarak sistemin yolunu göstereceğim. Ama önce hizmet birimlerine küçük bir giriş yapalım.

Bu makalede, systemd'deki "hizmet biriminin" ne olduğunu ve bir tane oluşturup çalıştırmanın ne kadar kolay olduğunu açıklayacağım. "Hedeflerin" ne olduğunu, onlara neden "birimler topluluğu" adını verdiğimizi ve onların "isteklerinin" neler olduğunu basitleştirmeye çalışacağım. Son olarak, önyükleme işleminden sonra kendi betiğimizi çalıştıracak bir hizmet biriminden yararlanıyoruz.

Bilgisayarınızın sunduğu hizmetlerden dolayı faydalı olduğu aşikardır ve bu işlevselliğe sahip olmak için, bilgisayarın önyükleme yapması ve farklı seviyelere ulaşması nedeniyle birçok hizmetin çağrılması gerekir.

Bilgisayar kurtarma düzeyine (çalışma düzeyi 0) ulaştığında diğer hizmetler yürütülmek üzere çağrılır ve diğerleri, çok kullanıcılı düzeye (çalışma düzeyi 3) ulaştığında yürütülmek üzere çağrılır. . Bu seviyeleri hedefler olarak düşünebilirsiniz.

Basit bir ifadeyle hedef, hizmet birimlerinin bir koleksiyonudur. graphical.target düzeyinizde çalışan hizmet birimlerine göz atmak istiyorsanız şunu yazın:

systemctl --type=service

Gördüğünüz gibi bazı hizmetler her zaman etkin ve "çalışıyor", diğerleri ise tek seferlik çalışıyor ve sonlandırılıyor (çıkış yapılıyor).

Bir servisin durumunu kontrol etmek istiyorsanız gösterildiği gibi systemctl komutunu kullanabilirsiniz.

systemctl status firewalld.service

Gördüğünüz gibi firewalld.service durumunu kontrol ettim (ipucu: hizmetin adı için otomatik tamamlamayı kullanabilirsiniz) ). Bana güvenlik duvarı hizmetinin sürekli çalıştığını ve etkin olduğunu bildiriyor.

Etkin ve devre dışı, sırasıyla bir sonraki önyükleme sırasında hizmetin kalıcı olarak yüklenip yüklenmeyeceği anlamına gelir. Öte yandan bir hizmetin başlatılması ve durdurulması mevcut oturum sınırlamasına sahiptir ve kalıcı değildir.

Örneğin şunu yazarsanız:

systemctl stop firewalld.service
systemctl status firewalld.service

firewalld.service'in etkin olmadığını (ölü) ancak hâlâ etkin olduğunu görebilirsiniz; bu, bir sonraki önyükleme sırasında yükleneceği anlamına gelir. Dolayısıyla, gelecekte önyükleme sırasında bir hizmetin yüklenmesini istiyorsak, onu etkinleştirmeliyiz. Ne harika bir sonuç! Hadi bir tane oluşturalım, çok kolay.

Klasöre giderseniz:

cd /etc/systemd/system
ls -l

Birim hizmetlerinin bazı bağlantı dosyalarını ve bir hedefin “isteklerinin” bazı dizinlerini görebilirsiniz. Örneğin, önyükleme prosedürü kendi seviyesine ulaştığında çok kullanıcılı hedefin yüklenmesini istediği şey, /etc/systemd/system/multi-user.target.wants/ adıyla dizinde listelenir. .

ls multi-user.target.wants/

Gördüğünüz gibi yalnızca hizmetleri değil, aynı zamanda hizmet koleksiyonları olan diğer hedefleri de içerir.

connection.service adında bir servis birimi oluşturalım.

vim connection.service

ve şunu yazın (ekleme modu için “i ” tuşuna basın), kaydedin ve çıkın (“esc ” ve “:wq! ” ile) ):

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Yukarıdakileri açıklamak gerekirse: hizmet tipinde bir birim oluşturduk (hedef tipte birimler de oluşturabilirsiniz) ve bunu network.target'ten sonra yüklenecek şekilde ayarladık (anlayabilirsiniz ki önyükleme prosedürünün hedeflere belirli bir sırayla ulaşması) ve hizmetin her başladığında oluşturacağımız conup.sh adında bir bash betiğini yürütmesini istiyoruz.

Eğlence son bölüm olan [kurulum] ile başlar. “multi-user.target” tarafından aranacağını söyler. Dolayısıyla, hizmetimizi etkinleştirirsek multi-user.target.wants klasöründe bu hizmete sembolik bir bağlantı oluşturulacaktır! Anladım? Ve eğer onu devre dışı bırakırsak bu bağlantı silinecektir. Çok basit.

Sadece etkinleştirin ve kontrol edin:

systemctl enable connection.service

multi-user.target.wants klasöründeki sembolik bağlantının oluşturulduğunu bize bildirir. ls komutunu gösterildiği gibi çalıştırarak onaylayabilirsiniz.

ls multi-user.target.wants/

Gördüğünüz gibi “connection.service ” bir sonraki önyüklemeye hazır, ancak önce komut dosyasını oluşturmamız gerekiyor.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Vim'in içine aşağıdaki satırı ekleyin ve kaydedin:

#!/bin/bash
nmcli connection up enp0s3

enp0s3 arayüzü için ağ bağlantısını getiren nmcli komutu.

Elbette, eğer betiğinizin başka bir şeyi yürütmesini istiyorsanız, ikinci satır yerine ne istiyorsanız onu yazabilirsiniz.

Örneğin,

#!/bin/bash
touch /tmp/testbootfile

bu, /tmp klasörü içinde bir dosya oluşturur (yalnızca hizmetinizin çalışıp çalışmadığını kontrol etmek için).

Ayrıca gösterildiği gibi chmod komutunu çalıştırarak betiği çalıştırılabilir hale getirmeliyiz.

chmod +x conup.sh

Artık hazırız. Bir sonraki önyüklemeye kadar beklemek istemiyorsanız (zaten etkindir), mevcut oturum için hizmeti şunu yazarak başlatabiliriz:

systemctl start connection.service

İşte! Bağlantım çalışıyor ve çalışıyor!

Eğer betiğin içine “touch /tmp/testbootfile ” komutunu yazmayı seçtiyseniz, sadece işlevselliğini kontrol etmek için bu dosyanın /tmp klasörü içinde oluşturulduğunu göreceksiniz. .

Önyükleme sırasında hangi hizmetlerin, isteklerin, hedeflerin ve komut dosyalarını çalıştırmanın neyle ilgili olduğunu anlamanıza gerçekten yardımcı olmayı umuyorum.