Sådan oprettes og køres nye serviceenheder i Systemd ved hjælp af Shell Script


For få dage siden stødte jeg på en Centos 7 32-bit distro, og jeg følte ønske om at teste den på en gammel 32-bit maskine. Efter opstart indså jeg, at den havde en fejl, og at den var ved at miste netværksforbindelsen, som jeg var nødt til at slå den "op" manuelt hver gang efter opstart. Så spørgsmålet var, hvordan kunne jeg indstille et script, der udførte dette job, kører hver gang jeg starter min maskine?

Nå, dette er meget simpelt, og jeg viser dig systemd-way ved hjælp af serviceenheder. Men først en lille introduktion til serviceenheder.

I denne artikel vil jeg forklare, hvad en "serviceenhed" i systemd er, hvor let er at oprette og køre en. Jeg vil forsøge at forenkle, hvad "mål" er, hvorfor vi kalder dem "samlinger af enheder", og hvad er deres "ønsker". Endelig drager vi fordel af en serviceenhed til at køre vores eget script efter opstartsproceduren.

Det er indlysende, at din computer er nyttig på grund af de tjenester, den tilbyder, og for at få denne funktionalitet skal mange tjenester kaldes, når computeren starter og når forskellige niveauer. Andre tjenester kaldes til at blive udført, når computeren f.eks. Når redningsniveauet (runlevel 0), og andre når det når multi-user-niveauet (runlevel 3). Du kan forestille dig disse niveauer som mål.

På en enkel måde er målet en samling af serviceenheder. Hvis du vil se på serviceenheder, der kører på dit grafiske.targetniveau, skal du skrive:

# systemctl --type=service

Som du kan se, er nogle tjenester aktive og “kører” hele tiden, mens andre kører engang og afslutter (afsluttes). Hvis du vil kontrollere status for en tjeneste, skal du skrive:

# systemctl status firewalld.service

Som du kan se, kontrollerede jeg status for firewalld.service (tip: du kan bruge auto-komplet til navnet på tjenesten). Det informerer mig om, at firewalld-tjenesten kører hele tiden, og den er aktiveret.

Aktiveret og deaktiveret betyder, at tjenesten vil blive indlæst permanent eller ikke under henholdsvis næste opstart. På den anden side er begrænsningen af den nuværende session at starte og stoppe en tjeneste, og den er ikke permanent.

Hvis du f.eks. Skriver:

# systemctl stop firewalld.service
# systemctl status firewalld.service

Du kan se, at firewalld.service er inaktiv (død), men den er stadig aktiveret, hvilket betyder, at den vil blive indlæst under næste opstart. Så hvis vi ønsker, at en tjeneste skal indlæses under opstartstid i fremtiden, skal vi aktivere den. Hvilken god konklusion! Lad os oprette en, det er let.

Hvis du går til mappen:

# cd /etc/systemd/system
# ls -l

Du kan se nogle linkfiler af enhedstjenester og nogle mapper over "ønsker" til et mål. For eksempel: hvad multibrugermålet skal indlæses, når opstartsproceduren når sit niveau, er angivet i biblioteket med navnet /etc/systemd/system/multi-user.target.wants/.

# ls multi-user.target.wants/

Som du kan se, indeholder den ikke kun tjenester, men også andre mål, som også er samlinger af tjenester.

Lad os lave en serviceenhed med navnet connection.service.

# vim connection.service

og skriv følgende (tryk “i” for indsættelsestilstand), gem den og afslut (med “esc” og “: wq!” ):

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

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

[Install]
WantedBy = multi-user.target

For at forklare ovenstående: vi har oprettet en enhed af servicetype (du kan også oprette enheder af måltype), vi har indstillet den til at blive indlæst efter netværket. Mål (du kan forstå, at opstartsproceduren når målene med en defineret rækkefølge), og vi vil have hver gang tjenesten begynder at udføre et bash-script med navnet conup.sh, som vi skal oprette.

Sjovet starter med den sidste del [installation]. Det fortæller, at det vil være ønsket af “multi-user.target”. Så hvis vi aktiverer vores service, oprettes der et symbolsk link til denne tjeneste inde i mappen multi-user.target.wants! Forstået? Og hvis vi deaktiverer det, slettes dette link. Så simpelt.

Bare aktiver det og kontroller:

# systemctl enable connection.service

det informerer os om, at det symbolske link i mappen multi-user.target.wants er oprettet. Tjekke det:

# ls multi-user.target.wants/

Som du kan se er “connection.service” klar til næste opstart, men vi skal først oprette scriptfilen.

# cd /root
# mkdir scripts
# cd scripts
# vim conup.sh

Tilføj følgende linje inde i vim, og gem den:

#!/bin/bash
nmcli connection up enp0s3

Selvfølgelig, hvis du vil have dit script til at udføre noget andet, kan du skrive hvad du vil i stedet for den anden linje.

For eksempel,

#!/bin/bash
touch /tmp/testbootfile

der ville oprette en fil inde i/tmp-mappen (bare for at kontrollere, at din tjeneste fungerer).

Vi skal også gøre scriptet eksekverbart:

# chmod +x conup.sh

Nu er vi klar. Hvis du ikke vil vente til næste opstart (den er allerede aktiveret), kan vi starte tjenesten for den aktuelle session at skrive:

# systemctl start connection.service

Voila! Min forbindelse er i gang!

Hvis du har valgt at skrive kommandoen "touch/tmp/testbootfile" inde i scriptet, bare for at kontrollere dens funktionalitet, vil du se denne fil oprettes inde i/tmp-mappen.

Jeg håber virkelig at hjælpe dig med at finde ud af, hvilke tjenester, ønsker, mål og kørsel af scripts under opstart handler om.