Zoeken op website

Nieuwe service-eenheden maken en uitvoeren in Systemd


Een paar dagen geleden kwam ik een Centos 8 32-bit distro tegen en ik voelde de wens om deze te testen op een oude 32-bit machine. Na het opstarten realiseerde ik me dat er een bug in zat en dat de netwerkverbinding verloren ging, wat ik elke keer na het opstarten handmatig moest “omhoog”. De vraag was dus: hoe kon ik een script instellen dat deze taak uitvoerde, elke keer dat ik mijn machine opstart?

Welnu, dit is heel eenvoudig en ik zal u de weg van het systeem laten zien met behulp van service-eenheden. Maar eerst een kleine introductie over service-eenheden.

In dit artikel ga ik uitleggen wat een “service unit” in systemd is, en hoe gemakkelijk het is om er een te maken en uit te voeren. Ik zal proberen te vereenvoudigen wat “doelen” zijn, waarom we ze “verzamelingen van eenheden” noemen en wat hun “wensen” zijn. Ten slotte maken we gebruik van een service-eenheid om ons eigen script uit te voeren na de opstartprocedure.

Het is duidelijk dat uw computer nuttig is vanwege de diensten die deze biedt en om deze functionaliteit te kunnen hebben, moeten veel diensten worden aangeroepen terwijl de computer opstart en verschillende niveaus bereikt.

Andere services worden aangeroepen om te worden uitgevoerd wanneer de computer bijvoorbeeld het reddingsniveau bereikt (runlevel 0) en andere wanneer deze het multi-user-niveau bereikt (runlevel 3). . U kunt zich deze niveaus voorstellen als doelen.

Op eenvoudige wijze is doel een verzameling service-eenheden. Als u service-eenheden wilt bekijken die op uw graphical.target-niveau worden uitgevoerd, typt u:

systemctl --type=service

Zoals u kunt zien, zijn sommige services actief en 'actief' de hele tijd, terwijl andere eenmalig worden uitgevoerd en worden beëindigd (afgesloten).

Als u de status van een service wilt controleren, kunt u de systemctl-opdracht gebruiken zoals weergegeven.

systemctl status firewalld.service

Zoals je kunt zien heb ik de status van firewalld.service gecontroleerd (tip: je kunt de automatische aanvulling gebruiken voor de naam van de service ). Ik krijg de melding dat de firewalld-service altijd actief is en is ingeschakeld.

Ingeschakeld en uitgeschakeld betekent dat de service permanent wordt geladen of niet, respectievelijk tijdens de volgende keer opstarten. Aan de andere kant heeft het starten en stoppen van een dienst de beperking van de huidige sessie en is het niet permanent.

Als u bijvoorbeeld typt:

systemctl stop firewalld.service
systemctl status firewalld.service

U kunt zien dat de firewalld.service inactief (dood) is, maar nog steeds ingeschakeld, wat betekent dat deze tijdens de volgende keer opstarten zal worden geladen. Dus als we willen dat een service in de toekomst tijdens het opstarten wordt geladen, moeten we deze inschakelen. Wat een geweldige conclusie! Laten we er een maken, het is eenvoudig.

Als je naar de map gaat:

cd /etc/systemd/system
ls -l

Je kunt enkele linkbestanden van eenheidsservices zien en enkele mappen met de “wensen” van een doelwit. Wat het doel voor meerdere gebruikers bijvoorbeeld wil laden wanneer de opstartprocedure zijn niveau bereikt, wordt vermeld in de map met de naam /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Zoals u kunt zien bevat het niet alleen services, maar ook andere doelen, die ook verzamelingen van services zijn.

Laten we een service-eenheid maken met de naam connection.service.

vim connection.service

en typ het volgende (druk op “i ” voor de invoegmodus), sla het op en sluit af (met “esc ” en “:wq! ” ):

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

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

[Install]
WantedBy = multi-user.target

Om het bovenstaande uit te leggen: we hebben een eenheid van servicetype gemaakt (u kunt ook eenheden van doeltype maken) en we hebben ingesteld dat deze wordt geladen na network.target (u begrijpt dat de de opstartprocedure bereikt de doelen in een gedefinieerde volgorde) en we willen elke keer dat de service begint een bash-script uitvoeren met de naam conup.sh dat we gaan maken.

Het plezier begint met het laatste deel [install]. Er staat dat het gewild zal zijn door “multi-user.target ”. Dus als we onze service inschakelen, wordt er een symbolische link naar die service gemaakt in de map multi-user.target.wants! Begrepen? En als we het uitschakelen, wordt die link verwijderd. Zo simpel.

Schakel het gewoon in en controleer:

systemctl enable connection.service

Het informeert ons dat de symbolische link in de map multi-user.target.wants is gemaakt. U kunt dit bevestigen door de opdracht ls uit te voeren, zoals weergegeven.

ls multi-user.target.wants/

Zoals je kunt zien is “connection.service” klaar voor de volgende keer opstarten, maar we moeten eerst het scriptbestand maken.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Voeg de volgende regel toe in Vim en sla deze op:

#!/bin/bash
nmcli connection up enp0s3

Het nmcli-commando om de netwerkverbinding voor de enp0s3-interface te openen.

Als u wilt dat uw script iets anders uitvoert, kunt u natuurlijk typen wat u maar wilt in plaats van de tweede regel.

Bijvoorbeeld,

#!/bin/bash
touch /tmp/testbootfile

dat zou een bestand aanmaken in de map /tmp (gewoon om te controleren of uw service werkt).

We moeten het script ook uitvoerbaar maken door de opdracht chmod uit te voeren, zoals weergegeven.

chmod +x conup.sh

Nu zijn we klaar. Als je niet wilt wachten tot de volgende keer opstarten (deze is al ingeschakeld), kunnen we de service voor de huidige sessie starten door het volgende te typen:

systemctl start connection.service

Voila! Mijn verbinding is actief!

Als u ervoor heeft gekozen om de opdracht “touch /tmp/testbootfile” in het script te schrijven, alleen om de functionaliteit ervan te controleren, zult u zien dat dit bestand is aangemaakt in de map /tmp. .

Ik hoop echt dat ik je kan helpen erachter te komen wat services, wensen, doelen en het uitvoeren van scripts tijdens het opstarten inhoudt.