Systemd nədir və niyə vacibdir?

Systemd Linux əməliyyat sistemlərinin ən fundamental elementlərindən biridir. Systemd bir başlanğıc xidmətidir. İnit sözü əslində “initializasiya” sözündən gəlir. Bu proses kompüter işə salındıqda başlayır və sistem söndürülənə qədər davam edir. Bu, əməliyyat sistemi işə salındıqda başlayan ilk prosesdir. Systemd-i sadəcə bir proses kimi düşünmək düzgün deyil. Poetrinqin 2013-cü ildə dediyi kimi, systemd əslində bir proses deyil, 69 müxtəlif ikili faylları ehtiva edən böyük proqram paketidir. Systemd Linux-da istifadəçi sahəsinin ilk prosesidir və istifadəçi sahəsini işə salır. PID olaraq 1 alır. Systemd nüvə tərəfindən işə salınır. Bu gün əksər Linux sistemləri systemd istifadə edir. Systemd haqqında hələ də ciddi müzakirələr gedir. Bəzi insanlar sistemi UNIX fəlsəfəsinə zidd hesab edirlər.İndi Systemd-də vahid konsepsiyası haqqında danışaq. Systemd-də vahidlər sistemin idarə edə biləcəyi istənilən resursdur. Müxtəlif növ vahidlər mövcuddur. Ümumiyyətlə, bu vahidlərin bir nüsxəsi /lib/systemd/system kataloqunda saxlanılır, lakin bu yerlə məhdudlaşmır. Bütün yolları görmək üçün bu komandanı işlədə bilərsiniz
systemctl show — property=UnitPath
Systemd-in əsas funksiyalarından biri əslində demon olmaqdır. Sondakı d hərfi buradan gəlir. Demonlar dediyimiz nə olursa olsun, demonlar qısaca desək, avtomatik başlayan, arxa planda işləyən, istifadəçi ilə əlaqə saxlamayan və daim işləyən proqramlardır. Onlar ümumiyyətlə bir hadisəni gözləyirlər və bu hadisə baş verəndə ona cavab olaraq müxtəlif tədbirlər görürlər.
Systemctl sizə sistem xidmətlərini idarə etməyə, dayandırmağa, işə salmağa və statuslarını yoxlamağa imkan verən əmrdir. systemctl ilə systemd xidmətlərini idarə etmək çox asandır. Məqalənin sonunda bir neçə əsas systemctl nümunəsi verdiyim üçün sistem xidmətlərini sadə sözlərlə idarə edə bilərsiniz.
Systemd ilə Linux servisini necə yarada bilərik?
Bütün bu nəzəriyyədən sonra bir az təcrübə etməyin vaxtı gəldi. Systemd ilə Linux xidmətini necə yarada biləcəyimizi görək. systemd ilə xidmət yaratmazdan əvvəl kök istifadəçiyə keçməyi tövsiyə edirəm.Mən də bu systemd xidməti ilə docker konteynerini işlədəcəm. Bunun üçün aşağıdakı docker komanda ilə docker konteyneri yaradaq.
docker run -p=7474:7474 -p=7687:7687 — volume=/home/ user/neo4j/data:/data — name neo4jdocker -d neo4j
İndi systemd qovluğunda .service genişlənməsi ilə fayl yaradaq.
Bu yolda nümunə faylı açaq: /etc/systemd/system/neo4j.service Bu servis root icazələri olmayan adi bir istifadəçi ilə başlamaq istəyirsinizsə, aşağıdakı qovluğa oxşar kataloqdan istifadə edə bilərsiniz.
$HOME/.config/systemd/user/neo4j.service
Nümunə servis faylımız
[Unit] Description=neo4j Container Requires=docker.service After=docker.service[Service] Restart=always ExecStart=/usr/bin/docker start -a neo4jdocker ExecStop=/usr/bin/docker stop -t 3 neo4jdocker[Install] WantedBy=local.target
Sonra bu komanda ilə servisi işə salaq
sudo systemctl start neo4j.service
sistemin başlanğıcında avtomatik olaraq işə salınması üçün
sudo systemctl enable neo4j.service
Servisin vəziyyətini görmək üçün
sudo systemctl status neo4j.service
Burada vacib məqam odur ki, siz həmişə tam indeksdən istifadə etməlisiniz. Beləliklə, /usr/bin/docker yerinə docker yaza bilməzsiniz. İndi servis faylımızdakı hər bir bölməni ayrıca nəzərdən keçirək.
Birinci hissədə biz bölmənin özünün xüsusiyyətlərini və onun asılılıqlarını daxil edirik. Bu bölmədə təsvir əlavə edə bilərik. Təsvirdə bu vahidi təsvir etmək üçün bir cümlə yaza bilərsiniz. Sonra “sonra” gəlir. Burada bölməmizin hansı xidmətlərə başlayacağını müəyyənləşdiririk. Xidmətimiz docker ilə işlədiyi üçün biz docker-i ilkin şərt kimi təyin edirik. Burada yerləşdirə biləcəyimiz digər seçimlər Tələblər və İstəyir. Sonra ilə yalnız göstərilən xidmətin işə salınıb-başlamaması yoxlanılır. Bununla belə, biz tələb və istək seçimləri ilə ayrıca tetikleyici də həyata keçirə bilərik. Bu seçimlərin hər ikisi bizim təyin etdiyimiz xidmətləri avtomatik olaraq işə salacaq. Bu ikisi arasındakı fərq, birinin məcburi, digərinin isə məcburi olmamasıdır. “Tələb edir” bölməsində göstərdiyimiz xidmət başlamazsa, xidmətimiz də başlamayacaq, lakin “İstəyir”də yumşaq asılılıq var, ona görə də qeyd etdiyimiz xidmət uğursuz olsa belə, xidmətimiz yenə də işə salınacaq.
İndi servis hissəsini izah edək. Servis bölməsində biz, əsasən, bölmə işə salındıqda hansı komandalarını işləyəcəyi haqqında məlumat veririk. ExecStart əmri ilə xidmətimiz işə salındıqda hansı əmrin işlədiləcəyini təyin edirik. Biz ExecStartPre və ya ExecStartPost seçimlərini də təyin edə bilərik. Eynilə, ExecStop ilə xidmət dayandırıldıqda hansı əmrin işləyəcəyini, ExecReload ilə isə xidmət yeniləndikdə hansı əmrin işlədiləcəyini təyin edə bilərik.Bunlara bənzər daha çox parametrlər var. Bütün bunları türkcəyə çevirməkdə çox tənbəl olduğum üçün istinad məqsədi ilə aşağıda bir məqalə paylaşacağam. Daha ətraflı məlumat üçün aşağıdakı əmri də işlədə bilərsiniz.
man systemd.service
Systemd targets
Köhnə başlanğıc sistemlərində istifadə olunan icra səviyyəsi məntiqi systemd və “sistem hədəfləri” adlanan konsepsiya ilə əvəz edilmişdir. Bu “sistem hədəfləri” .target uzantılı vahid fayllarında müəyyən edilir. Onların etdiklərini qısaca ümumiləşdirmək üçün xidmətləri qruplaşdırmaq və hansı xidmət bölmələrinin hansı iş rejimində işlədiyini müəyyən etməkdir.
Hansı targets standart olduğunu görmək üçün aşağıdakı əmrdən istifadə edilə bilər.
# systemctl get-default
Sistemdəki bütün targetləri görmək üçün systemctl aşağıdakı kimi istifadə edilə bilər
# systemctl list-units — type target
Defolt targeti dəyişdirmək istəyirsinizsə, aşağıdakılara bənzər bir əmrdən istifadə edə bilərsiniz
# systemctl set-default multi-user.target
Nümunə systemctl komandalarına baxaq Servisi başlamaq üçün
sudo systemctl start application.service
Servisi dayandırmaq üçün
sudo systemctl stop application.service
Servisi yenidən başlatmaq üçün
sudo systemctl restart application.service
Servisi aktivləşdirmək və söndürmək üçün
sudo systemctl disable application.service sudo systemctl enable application.service
Servisin vəziyyətini yoxlamaq üçün
systemctl status application.service
Bütün servisləri görmək üçün
systemctl list-units — type=service — all
Servisin təfərrüatlarına baxmaq üçün
systemctl cat application.service və ya systemctl show application.service
Oxumaq üçün faydalı mənbələr:
https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
https://wiki.archlinux.org/index.php/systemd
https://www.freedesktop.org/software/systemd/man/systemd.service.html