systemd

systemd enhedsfil opretter en tjeneste

systemd enhedsfil opretter en tjeneste
Servicestyring er noget, du ikke engang tænker på, når du bruger din Linux-arbejdsstation eller Linux-server hver dag, men når den ikke er der, vil du virkelig hader det. Når du f.eks. Opretter et nyt serverprogram, der skal køre 24/7, er det et mareridt at gøre denne udfordring uden servicemanagement, hvor du faktisk opretter et lille servicesystem, hvilket naturligvis ikke vil være så godt som den manager, der er udviklet af en fuldt hold i årevis, alligevel.

Med sine tjenester gør systemd alt dette lettere, virkelig lettere. Så snart du vil have noget, der overvåger din applikation og nem kontrol over den, er systemd vejen at gå, og det er hvad jeg vil forklare her!

Hvor er Systemd Services

For at tilføje en ny tjeneste skal du besvare dette spørgsmål. Som altid i systemd afhænger det af, om tjenesten kun er til din bruger eller hele systemet. Vi fokuserer på, hvordan systemd fungerer for hele systemtjenester.

Den nøjagtige placering afhænger af, hvorfor og hvordan tjenesten blev installeret. Hvis tjenesten installeres af en pakkehåndtering, vil den normalt være i / usr / lib / systemd / system. For software, du udvikler, eller dem, der ikke understøtter systemd i sig selv, placerer du servicefilen i / usr / local / lib / systemd / system. Husk dog, at nogle distributioner ikke understøtter denne mappe i / usr / local. Endelig, hvis du vil konfigurere en eksisterende systemd-tjeneste, / etc / systemd / system er vejen at gå.

Inde i disse mapper kan du finde flere filtypenavne såsom *.stikkontakt, *.mål eller *.service. Vi vil naturligvis fokusere på det sidste. systemd bruger filnavnet som navnet på tjenesten, når den startes eller stoppes osv. Således indeholder filnavne i tjeneste kun alfanumeriske tegn sammen med bindestreger og understregninger. Under udviklingen anbefaler jeg at oprette det i dine dokumenter og derefter kopiere det til systemd placering, når det er gjort, det ville undgå problemer, hvis du gemmer midt i redigeringen.

OK, så vær venlig at oprette din servicefil i dine dokumenter. Nu er vi klar til at gennemgå, hvordan vi skriver denne fil.
[Bemærk: Se potentiel fejlrapport i kommentarsektionen i dette blogindlæg]

[Enhed]
Beskrivelse = Penguins Web Application HTTP-server (kører i port 8080)
WantedBy = flerbruger.mål
 
[Service]
Type = enkel
ExecStart = / usr / bin / python3 / usr / local / bin / penguin-web-app / main.py
Genstart = altid

Filformatet er faktisk tæt på ini. Jeg ved, det kan være underligt, da ini-filer ofte findes i Windows, men sådan fungerer det. Servicefilen er først opdelt i 2 sektioner: [Enhed] og [Service]. Hver sektion konfigurerer et specifikt aspekt af systemd: [Enhed] indeholder elementer, der deles af alle systemd enhedsfiler, mens [Service] kun er til konfiguration, der er specifik for opsætning af en ny tjeneste.

Derefter er sektionen konfigureret med egenskaber såsom Beskrivelse = eller ExecStart =. Værdien adskilles fra ejendomsnavnet med ligetegnet = uden mellemrum.

Lad os gå tilbage til filen vist ovenfor. Den beskriver en tjeneste designet til at køre en webapp skrevet i Python om pingviner. systemd genstarter det, når processen afsluttes og starter serveren ved opstart af serveren, hvis du aktiverer den med systemctl-aktiveringskommando. Cool eh?

Men du er måske din næste webapp ikke handler om pingviner - og det er en skam - og det er ikke skrevet i Python. I dette tilfælde vil du gerne lære mere om de mulige konfigurationer.

Egenskaber for Systemd Services

Lad os først fokusere på egenskaberne i [Unit]:

Beskrivelse = handler kun om at give en klar beskrivelse af, hvad tjenesten udfører. Det vises i servicelisten, servicelogfiler, så du vil have det beskrivende, men det skal forblive i en linje og en sætning.

WantedBy = tillader at sige til systemd: når denne ting startes, starter mig også. Generelt sætter du navnet på et mål. Eksempler på fælles mål:

  1. flerbruger.mål: når serveren er OK og er klar til at køre kommandolinjeapplikationer
  2. grafisk.mål: når GNOME eller KDE er klar
  3. netværk-up.mål: når serveren er tilsluttet korrekt til et netværk

OK til at begynde med er disse egenskaber for [Enhed] nok. Lad os se på [Service] nu.

Type = hjælper systemd med at vide, om en tjeneste kører. Her er almindelige typer:

  1. simpelt er sandsynligvis den mest anvendte: systemd betragter den proces, du starter, som den, der udfører tjenesten. Hvis processen stopper, betragter den tjenesten også stoppet osv.
  2. forking foretrækkes til applikationer, der er skrevet til at være en server, men uden hjælp fra et servicestyringssystem. Dybest set forventer den, at den lancerede proces gaffel, og den gaffel betragtes som den sidste proces for tjenesten. For at være mere præcis kan du også hjælpe systemd med en PID-fil, hvor PID for processen, der skal spores, er skrevet af den lancerede applikation.

ExecStart = er sandsynligvis det vigtigste for en tjeneste: det præciserer, hvilket program der skal startes, når du starter tjenesten. Som du kan se i Penguin-tjenesten, har jeg brugt / usr / bin / python3 og ikke python3 med det samme. Det er fordi systemdokumentation eksplicit anbefaler at bruge absolutte stier for at undgå overraskelser.

Men det er også af en anden grund. Andre services styringssystem er ofte baseret på Shell-scripts. Dog kører systemd af ydeevneårsag ikke en shell som standard. Så du kan ikke angive en shell-kommando direkte i ExecStart =. Du kan dog stadig bruge et shell-script ved at gøre:

ExecStart = / usr / bin / bash / usr / local / bin / launch-penguin-server.sh

Ikke så hårdt rigtigt? Bemærk, at hvis du har brug for at køre en proces for at signalere, at din tjeneste skal stoppe rent, findes ExecStop =, såvel som ExecReload = til genindlæsning af tjenester.

Restart = giver dig mulighed for eksplicit at fortælle, hvornår tjenesten skal genstartes. Dette er en af ​​de vigtige funktioner i systemd: det sikrer, at din service forbliver oppe, så længe du vil, så vær opmærksom på denne mulighed.

Genstart = Betyder
altid systemd vil fortsætte med at genstarte det, når det afsluttes eller går ned. Nå, indtil du systemctl stopper servicenavn.service.

Det er perfekt til servere og onlinetjenester, da du foretrækker få ubrugelige genstarter frem for at skulle manuelt genstarte tjenesten uden nogen grund.

on-unormal Når serviceprocessen går ned, skal du genstarte tjenesten. Men hvis applikationen afsluttes rent, skal du ikke genstarte den.

Det er mere nyttigt til cron-job som tjenester, der skal udføre en opgave pålideligt, men ikke har brug for at køre hele tiden.

ved fiasko Ligesom on-unormal, men det genstarter også tjenesten, når applikationen afsluttes rent, men med en ikke-nul-udgangskode. Udgangskoder, der ikke er nul, betyder generelt, at der opstod en fejl.
ingen systemd genstarter ikke tjenesten automatisk.

Generelt nyttigt for at få adgang til andre systemfunktioner såsom logning uden genstartfunktionen.

WorkingDirectory = kan håndhæve en arbejdsmappe, når din applikation startes. Værdien skal være en absolut katalogsti. Arbejdsmappe bruges, når du bruger relative stier i applikationens kode. For vores pingvinservice kan det være:

WorkingDirectory = / srv / penguin-web-app /

Derefter er sikkerhed vigtig, så du generelt ikke vil starte din tjeneste med rodrettigheder. Bruger = og Gruppe = giver dig mulighed for at indstille bruger- eller gruppenavn eller UID / GID, hvorunder din applikation vil blive startet. For eksempel:

Bruger = pingvin-web
Gruppe = pingvin-web

EnvironmentFile = er en stærk mulighed. Programmer, der kører som tjenester, har ofte brug for konfiguration, og miljøfiler giver mulighed for at indstille konfigurationen på to måder:

  1. Applikationen kan læse direkte miljøvariablen.
  2. Men også du kan indstille forskellige kommandolinjeargumenter til din applikation uden at ændre servicefilen.

Syntaksen for denne fil er enkel: du skriver navnet på miljøvariablen, ligestillingen = og derefter dens værdi. Derefter placerer du den absolutte sti til din miljøfil i EnvironmentFile-ejendommen.

Så eksempel:

EnvironmentFile = / etc / penguin-web-app / miljø

Og / etc / penguin-web-app / miljø-filen indeholder:

LISTEN_PORT = 8080

Så får vores pingviner-webapp adgang til miljøvariablen LISTEN_PORT og lytter til den forventede havn.

Gem og start den nyoprettede Systemd-tjeneste

Så hvis du fulgte mit råd, redigerede du din servicefil i dit hjemmekatalog. Når du er tilfreds, skal du kopiere filen til / usr / local / lib / systemd / system, forudsat at din distribution understøtter den sti. Filnavnet på din servicefil vil være dens servicenavn. Dette filnavn skal slutte med .service. For eksempel for vores pingvinserver ville det være penguin-web-app.service.

Derefter skal du fortælle systemd, at du har tilføjet en ny tjeneste, så du skal skrive denne kommando:

$ sudo systemctl dæmon-genindlæsning

Okay nu er systemd opmærksom på din nye tjeneste, forudsat at din fil ikke indeholder en syntaksfejl. Det er trods alt din første fil, så det er sandsynligt, at du laver fejl. Du skal køre denne kommando ovenfor på hver opdatering i din servicefil.

Nu er det tid til at starte tjenesten:

$ sudo systemctl start penguin-web-app.service

Hvis det fejler med en enhed, der ikke findes en fejl som denne:

$ sudo systemctl start penguin-web-app.service
Penguin-web-app kunne ikke startes.service: Enhed ikke fundet.

Det betyder, at din distribution ikke understøtter biblioteket, eller at du ikke navngav din servicefil korrekt. Sørg for at tjekke ud.

Hvis du konfigurerer din tjeneste med WantedBy = og ønsker, at din tjeneste starter automatisk, skal du aktivere den med denne kommando:

$ sudo systemctl aktiver penguin-web-app.service

Den seje ting med en tjeneste er, at den kører i baggrunden. Problemet: hvordan man ved, om det kører korrekt, og om det kører, hvis det kører i baggrunden? Bare rolig, systemd-teamet tænkte også på det og leverede en kommando for at se, om det kører korrekt, da hvor meget tid osv:

$ systemctl status penguin-web-app.service

Konklusion

tillykke! Du kan nu få dine applikationer administreret uden at du bekymrer dig om at genstarte det manuelt hver gang. Nu anbefaler jeg dig at læse vores anden artikel om systemd-logfiler: Master journalctl: forstå systemd-logfiler. Med det kan du bruge det kraftfulde logningssystem på din nye tjeneste og opbygge mere pålidelige servere!

Sådan installeres League Of Legends på Ubuntu 14.04
Hvis du er fan af League of Legends, er dette en mulighed for dig at prøvekøre League of Legends. Bemærk, at LOL understøttes på PlayOnLinux, hvis du ...
Installer det nyeste OpenRA-strategispil på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spilmotor, der genskaber de tidlige Westwood-spil som det klassiske Command & Conquer: Red Alert. Distrib...
Installer nyeste Dolphin Emulator til Gamecube & Wii på Linux
Dolphin Emulator giver dig mulighed for at spille dine valgte Gamecube & Wii-spil på Linux Personal Computers (PC). Som en frit tilgængelig og open s...