I Linux spiller systemctl en central rolle i ad­mi­ni­stra­tio­nen af init-systemet og ser­vi­cesty­rings­sy­ste­met systemd. Med systemctl har brugerne kontrol over systemd-tjenester, deres enheder og kon­fi­gu­ra­tio­ner, hvilket gør det til et uund­vær­ligt værktøj til sy­stemad­mi­ni­stra­tion. Fra styring af opstart til til­pas­ning af sy­stem­til­stan­de tilbyder systemctl en bred vifte af funk­tio­ner.

Hvad er systemctl?

systemctl er et kom­man­do­linje­værk­tøj til ad­mi­ni­stra­tion af systemd, et init-system og en sy­stemad­mi­ni­stra­tor til Linux-ope­ra­tiv­sy­ste­mer. systemd er i dag standard-init-systemet i flere Linux-di­stri­bu­tio­ner og Linux-ser­ver­di­stri­bu­tio­ner, såsom Ubuntu, Debian, Fedora, Red Hat En­ter­pri­se Linux (RHEL), CentOS, Arch Linux, Mageia og Gentoo. Det er dog ikke im­ple­men­te­ret i alle di­stri­bu­tio­ner.

I systemd-øko­sy­ste­met spiller systemctl en central rolle i ad­mi­ni­stra­tio­nen af sy­stemtje­ne­ster, kon­fi­gu­ra­tion, op­start­sad­færd og sy­stem­ved­li­ge­hol­del­se. Værk­tø­jets funk­tio­na­li­tet rækker langt ud over blot at starte og stoppe tjenester. Det giver mulighed for om­fat­ten­de ad­mi­ni­stra­tion af næsten alle aspekter af et Linux-system.

I denne vej­led­ning finder du praktiske ko­de­ek­semp­ler og Linux-kom­man­do­er til brug af systemctl. Ek­semp­ler­ne nedenfor er baseret på Ubuntu 22.04.

Ser­vi­cesty­ring

Ho­ved­for­må­let med init-systemet er at starte de kom­po­nen­ter, der er nød­ven­di­ge efter opstart af Linux-kernen (bru­ger­græn­se­fla­de­kom­po­nen­ter). Init-systemet bruges også til effektivt at styre tjenester og daemons på en server på ethvert tidspunkt under systemets drift.

I systemd fokuserer de fleste processer på res­sour­cer, der ad­mi­ni­stre­res af systemet. Disse kaldes enheder. Enhederne klas­si­fi­ce­res efter den type ressource, de re­præ­sen­te­rer, og defineres via en­heds­fi­ler. Du kan genkende en­heds­ty­pen på filtypen.

Når man ad­mi­ni­stre­rer tjenester, er de tje­ne­ste­en­he­der, der slutter med endelsen .service, vigtige. Det er dog ikke altid nød­ven­digt at bruge denne endelse i kom­man­do­er til tje­ne­ste­ad­mi­ni­stra­tion. systemd kan genkende, at sådanne kom­man­do­er generelt henviser til tjenester.

Start og stop tjenester

En af de mest al­min­de­li­ge opgaver, der udføres under Linux med systemctl, er at starte og stoppe tjenester. Disse funk­tio­ner er afgørende for sy­stemad­mi­ni­stra­tion og giver dig mulighed for at bevare kon­trol­len over de processer, der kører på systemet. For at starte en tjeneste skal du bruge kom­man­do­en start. Hvis du arbejder som bruger uden root-ret­tig­he­der, skal du bruge sudo.

$ sudo systemctl start application.service
bash

Da systemd er udviklet til au­to­ma­tisk at søge efter .service -filer til kom­man­do­er til tje­ne­stesty­ring, kan kom­man­do­en også indtastes i en forenklet form:

$ sudo systemctl start application
bash

Hvis du f.eks. vil starte Apache-web­ser­ve­ren, skal du skrive:

$ sudo systemctl start apache2
bash

Hvis du vil stoppe en kørende tjeneste, skal du bruge stop:

$ sudo systemctl stop application.service
bash

Genstart og genindlæs

For at genstarte en tjeneste, hvilket ofte er nød­ven­digt efter en kon­fi­gu­ra­tions­æn­dring, skal du bruge kom­man­do­en restart:

$ sudo systemctl restart application.service
bash

Hvis et program kan ge­nind­læ­se sine kon­fi­gu­ra­tions­fi­ler uden at genstarte, kan kom­man­do­en reload bruges til at starte processen:

$ sudo systemctl reload application.service
bash

Hvis du er i tvivl om, hvorvidt en tjeneste un­der­støt­ter ge­nind­læs­ning af kon­fi­gu­ra­tio­nen, kan du bruge kom­man­do­en reload-or-restart. Dette vil ge­nind­læ­se kon­fi­gu­ra­tio­nen, hvis denne funktion un­der­støt­tes. Hvis den ikke un­der­støt­tes, vil kom­man­do­en genstarte tjenesten for at igang­sæt­te kon­fi­gu­ra­tions­op­da­te­rin­gen.

$ sudo systemctl reload-or-restart application.service
bash

Aktivér og deaktiver tjenester

Ved at aktivere og de­ak­ti­ve­re tjenester kan du angive, om en tjeneste skal startes au­to­ma­tisk, når systemet starter op. Dette er især vigtigt for systemets ydeevne, sik­ker­he­den og styringen af af­hæn­gig­he­der mellem for­skel­li­ge tjenester. Brug kom­man­do­en enable til at kon­fi­gu­re­re au­to­ma­tisk ak­ti­ve­ring ved sy­stem­start:

$ sudo systemctl enable application.service
bash

Når denne proces udføres, oprettes der et symbolsk link. Dette link forbinder kopien af sy­stemtje­ne­ste­fi­len. Sy­stemtje­ne­ste­fi­len findes normalt under /lib/systemd/system eller /etc/systemd/system. Her finder du også den mappe på hard­di­sken, hvor systemd søger efter filer til autostart. Dette sker normalt under /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

For at forhindre, at en tjeneste starter au­to­ma­tisk ved opstart, skal du bruge disable:

$ sudo systemctl disable application.service
bash

Herefter slettes det symbolske link, der angiver au­to­ma­tisk ak­ti­ve­ring ved opstart.

Bemærk: Det er ikke nok blot at aktivere en tjeneste for at starte den med det samme i den aktuelle session. For at starte tjenesten med det samme og indstille den til at starte au­to­ma­tisk ved opstart skal du udføre både kommando start og enable.

Tjek status for tje­ne­ster­ne

Med systemctl kan man få vist op­lys­nin­ger om tje­ne­ster­nes status. Dette er især nyttigt til over­våg­ning og fejl­find­ing af den aktuelle status for system- og pro­gramtje­ne­ster. Brug kom­man­do­en status til at tjekke:

$ systemctl status application.service
bash

Denne kommando giver en række op­lys­nin­ger, herunder tje­ne­stens aktuelle status (aktiv, inaktiv, fejl­be­hæf­tet osv.), de senest udførte processer og log­med­del­el­ser, cgroup-hie­rar­ki­et samt de første loglinjer.

For at kon­trol­le­re den aktuelle ak­ti­vi­tets­sta­tus for en tjeneste under Linux med systemctl bruges is-active. Denne kommando angiver, om en tjeneste i øje­blik­ket er aktiv eller ej:

$ systemctl is-active application.service
bash

Den aktuelle status angives normalt som active, hvis tjenesten er aktiv, eller inactive, hvis tjenesten er inaktiv.

For at kon­trol­le­re, om en tjeneste er kon­fi­gu­re­ret til au­to­ma­tisk at blive aktiveret ved sy­stem­start, kan du bruge kom­man­do­en is-enabled. Dette er især nyttigt til at ad­mi­ni­stre­re start­kon­fi­gu­ra­tio­nen af tjenester på et Linux-system.

$ systemctl is-enabled application.service
bash

Kom­man­do­en angiver, om tjenesten er aktiveret eller de­ak­ti­ve­ret, og indstil­ler af­slut­nings­ko­den til hen­holds­vis ’0’ eller ’1’ afhængigt af svaret.

Du kan også bruge kom­man­do­en is-failed til at kon­trol­le­re, om en bestemt tjeneste har en fejl­sta­tus:

$ systemctl is-failed application.service
bash

Hvis ud­fø­rel­sen lykkes, vises active. Hvis der opstår en fejl, vises failed. Hvis enheden blev stoppet bevidst, kan unknown eller inactive vises som svar. En af­slut­nings­sta­tus på 0 angiver, at der er opstået en fejl, mens 1 angiver en anden status.

Sy­stem­sta­tus

De kom­man­do­er, der er blevet gen­nem­gå­et indtil nu, har fokuseret på ad­mi­ni­stra­tio­nen af de enkelte tjenester. Disse kom­man­do­er giver dog ikke indsigt i systemets aktuelle status. Der findes en række systemctl-kom­man­do­er, der netop kan levere denne type in­for­ma­tion.

list-units er et nyttigt værktøj til at få et overblik over de aktuelle enheder i Linux:

$ systemctl list-units
bash

Når du kører denne kommando, viser systemctl en liste over de enheder, der ad­mi­ni­stre­res af systemd. Listen in­de­hol­der for­skel­li­ge kolonner med spe­ci­fik­ke op­lys­nin­ger om hver enkelt enhed. Følgende kolonner vises:

  • UNIT: Navnet på enheden (dette hentes ofte fra enhedens filnavn, f.eks. sshd.service for SSH-daemonen
  • LOAD: Angiver, om en­heds­fi­len blev indlæst korrekt; mulige værdier er loaded, not-found eller error.
  • ACTIVE: Enhedens ak­ti­vi­tets­sta­tus, som kan skifte mellem tilstande såsom active, inactive, activating eller deactivating
  • SUB: Den un­der­ord­ne­de ak­ti­vi­tets­sta­tus, der giver yder­li­ge­re detaljer om enhedens tilstand (For eksempel kan en active have en SUB-status på running, exited eller failed.)
  • DESCRIP­TION: En kort be­skri­vel­se af enheden, der ofte afspejler enhedens formål eller funk­tio­na­li­tet

Kom­man­do­en viser dog som standard kun aktive enheder. Af denne grund viser kolonnen LOAD i ud­skrif­ten typisk loaded, mens kolonnen ACTIVE viser active. Ved hjælp af yder­li­ge­re flag kan systemctl kon­fi­gu­re­res til også at vise yder­li­ge­re op­lys­nin­ger. Hvis man f.eks. bruger flaget --all, vises alle enheder, der er indlæst af systemd, uanset deres aktuelle ak­ti­vi­tets­sta­tus.

$ systemctl list-units --all
bash

Re­sul­ta­tet kan yder­li­ge­re finju­ste­res ved hjælp af yder­li­ge­re flag, f.eks. --state=, til at filtrere efter bestemte tilstande i ka­te­go­ri­er­ne LOAD, ACTIVE eller SUB. Det er vigtigt at beholde flag --all, så inaktive enheder også vises:

$ systemctl list-units --all --state=inactive
bash

Du kan også bruge filter --type= til at vise bestemte typer enheder, f.eks. hvis du kun vil se enheder i aktiv tjeneste:

$ systemctl list-units --type=service
bash

Vis alle en­heds­fi­ler

For at få vist en liste over alle en­heds­fi­ler på Linux med systemctl (herunder dem, som systemd ikke har forsøgt at indlæse), kan du bruge list-unit-files. Denne kommando viser alle en­heds­fi­ler, som systemd har kendskab til, herunder tjenester, sockets, mål og mere.

$ systemctl list-units-files
bash

Kom­man­do­en viser for­skel­li­ge tilstande for en­heds­fi­ler. Disse tilstande angiver, hvordan de på­gæl­den­de enheder er kon­fi­gu­re­ret, især med hensyn til deres adfærd ved sy­stem­start. De mest al­min­de­li­ge tilstande er

  • Aktiveret: Enheden er kon­fi­gu­re­ret til at blive aktiveret au­to­ma­tisk ved sy­stem­start.
  • De­ak­ti­ve­ret: Enheden er ikke kon­fi­gu­re­ret til au­to­ma­tisk opstart under boot-processen.
  • Maskeret: Enheden er fuld­stæn­digt de­ak­ti­ve­ret, så den hverken kan startes manuelt eller au­to­ma­tisk.
  • Statisk: Enheden startes ikke uaf­hæn­gigt, men afhænger typisk af en anden enhed og startes kun i denne sam­men­hæng.

Af­de­lings­le­del­se

En af sy­stemctls vigtigste opgaver er ad­mi­ni­stra­tio­nen af enheder. systemctl tilbyder en række nyttige kom­man­do­er og indstil­lin­ger, der gør det nemmere at få spe­ci­fik­ke op­lys­nin­ger om de enkelte enheder og at ad­mi­ni­stre­re dem.

Vis en enhedsfil

Hvis du ønsker, at indholdet af en bestemt enhedsfil skal vises direkte i konsollen, kan du bruge kom­man­do­en cat. Hvis du f.eks. vil se en­heds­fi­len for en tjeneste som ssh.service, skal du indtaste:

$ systemctl cat ssh.service
bash

Vis af­hæn­gig­he­der

Hvis du bruger list-dependencies, vises af­hæn­gig­he­der­ne for en bestemt enhed i en træ­struk­tur. Kom­man­do­en ser således ud:

$ systemctl list-dependencies sshd.service
bash

Som standard vises af­hæn­gig­he­der­ne for .target enheder, der re­præ­sen­te­rer for­skel­li­ge sy­stem­til­stan­de. Brug flagget --all for at få en komplet, rekursiv liste over alle af­hæn­gig­he­der.

For at få vist omvendte af­hæn­gig­he­der (dvs. enheder, der afhænger af den angivne enhed) skal du tilføje --reverse til kom­man­do­en. Med flagene --before og —after kan du også se de af­hæn­gig­he­der, der starter før eller efter den på­gæl­den­de enhed.

Skjul og vis enheder

Når man maskerer en enhed, de­ak­ti­ve­res den reelt, så den hverken kan startes manuelt eller au­to­ma­tisk. Dette bruges ofte til at sikre, at en tjeneste eller en enhed ikke startes ved et uheld eller au­to­ma­tisk på grund af af­hæn­gig­he­der. Maskering sker ved at oprette et symbolsk link fra den relevante enhedsfil til /dev/null ved hjælp af kom­man­do­en mask:

$ sudo systemctl mask nginx.service
bash

Dette sikrer, at Nginx-tjenesten ikke kan startes manuelt eller au­to­ma­tisk, mens den er i maskeret tilstand.

Fjernelse af maskering ophæver en enheds maskerede status, så den igen kan startes normalt. Kom­man­do­en til fjernelse af maskering er unmask:

$ sudo systemctl unmask nginx.service
bash

Re­di­ge­ring af en­heds­fi­ler

systemctl har funk­tio­ner til at tilpasse og ændre en­heds­fi­ler. Disse funk­tio­ner blev in­tro­du­ce­ret med version 218 af systemd. Hvis du bruger kom­man­do­en edit, åbnes en enhedsfil i den valgte enhed au­to­ma­tisk, så du kan redigere den:

$ sudo systemctl edit nginx.service
bash

Når man redigerer, oprettes der en tom fil, hvor man kan tilføje eller ændre spe­ci­fik­ke in­struk­tio­ner til en en­heds­de­fi­ni­tion. For hver enhed (f.eks. nginx.service) oprettes der en un­der­map­pe i mappen /etc/systemd/system, hvor filnavnet får tilføjet endelsen .d. I eksemplet ovenfor vil un­der­map­pen hedde nginx.service.d.

Der oprettes en override.conf-fil i denne un­der­map­pe. Når systemd indlæser enheden, kom­bi­ne­rer det indholdet af denne fil med den op­rin­de­li­ge enhedsfil. Her har in­struk­tio­ner­ne i denne fil forrang. For at behandle hele en­heds­fi­len kan flagget --full bruges:

$ sudo systemctl edit --full nginx.service
bash

Hvis du trykker på --full, åbnes den ek­si­ste­ren­de enhedsfil i et re­di­ge­rings­pro­gram, så du kan foretage ændringer. Når du lukker re­di­ge­rings­pro­gram­met, gemmer systemet den re­di­ge­re­de fil i /etc/systemd/system.

Hvis du vil fortryde ændringer, du selv har foretaget, kan du enten slette enhedens kon­fi­gu­ra­tions­map­pe .d eller den ændrede fil i /etc/systemd/system:

$ sudo rm -r /etc/systemd/system/nginx.service.d
bash

En fuld­stæn­dig revideret enhedsfil kan slettes med følgende kommando:

$ sudo rm /etc/systemd/system/nginx.service
bash

Når du har slettet filen eller mappen, skal du genstarte systemd, så det ikke længere henviser til de slettede filer, men i stedet bruger systemets egen kopi:

$ sudo systemctl daemon-reload
bash

Justering af sy­stem­til­stand (kør­selstil­stand) med mål

systemd bruger primært »target« til at samle for­skel­li­ge enheder i grupper. Dette gøres for at opnå en bestemt sy­stem­til­stand, svarende til runlevels i andre init-systemer. Filerne med filtypen .target fungerer som ori­en­te­rings­punk­ter, der angiver, om bestemte funk­tio­ner er til­gæn­ge­li­ge. Dette giver brugerne mulighed for at angive den ønskede over­ord­ne­de tilstand i stedet for de enkelte enheder, der kræves.

Et konkret eksempel er swap.target, som angiver, at enheden er klar til ud­skift­ning. Enheder, der indgår i ud­skift­nings­pro­ces­sen, kan tilpasse sig dette mål ved hjælp af kon­fi­gu­ra­tions­indstil­lin­ger som WantedBy= eller RequiredBy=. Enheder, der er afhængige af ud­skift­nin­gen, kan derimod angive dette med indstil­lin­ger som Wants=, Requires= og After= for at udtrykke deres af­hæn­gig­hed og start­se­kvens i forhold til ud­skift­nin­gen.

Hent og kon­fi­gu­rer stan­dard­desti­na­tion

Ved at hente og kon­fi­gu­re­re stan­dard­må­let kan du definere en stan­dardtil­stand for dit system ved opstart. Sådan finder du stan­dard­må­let for dit system:

$ systemctl get-default
Output
multi-user.target
bash

Hvis du vil ændre stan­dard­må­let, skal du bruge kom­man­do­en set-default sammen med navnet på målet. Brug følgende kommando til at indstille stan­dard­må­let til graphical.target, hvilket starter en grafisk bru­ger­græn­se­fla­de:

$ sudo systemctl set-default graphical.target
bash

Vis til­gæn­ge­li­ge desti­na­tio­ner

For at få vist alle de desti­na­tio­ner, der er til­gæn­ge­li­ge på dit system, kan du bruge følgende kommando:

$ systemctl list-unit-files --type=target
bash

Her vises en liste over alle må­len­heds­fi­ler, der er in­stal­le­ret på dit system. Der vises sti og aktuel status (f.eks. aktiveret eller de­ak­ti­ve­ret) for hvert mål.

Udvælg mål

Med isolate kan du samtidig aktivere alle enheder, der er knyttet til et bestemt mål, og de­ak­ti­ve­re alle andre enheder, der ikke er knyttet til det.

Lad os antage, at du arbejder i et miljø, hvor graphical.target er aktiv, og at du ønsker at skifte til en ren fler­bru­ger­til­stand uden grafisk bru­ger­græn­se­fla­de. I dette tilfælde kan du de­ak­ti­ve­re det grafiske system ved at isolere multi-user.target. Da graphical.target er afhængig af multi-user.target, men ikke omvendt, stoppes alle grafiske tjenester ved skiftet.

Du bør dog kon­trol­le­re de til­knyt­te­de af­hæn­gig­he­der, før du isolerer et mål. På den måde undgår du, at vigtige processer ufor­va­ren­de stoppes.

$ systemctl list-dependencies multi-user.target
bash

Hvis du har markeret de aktive enheder, du vil beholde, og er enig i valget, kan du angive den ønskede desti­na­tion:

$ sudo systemctl isolate multi-user.target
bash

Genveje til vigtige be­gi­ven­he­der

Der findes spe­ci­fik­ke kom­man­do­er til vigtige hand­lin­ger som f.eks. at lukke systemet ned eller genstarte det. Under Linux tilbyder systemctl dog også praktiske genveje, der giver adgang til yder­li­ge­re funk­tio­ner. Hvis du f.eks. vil sætte systemet i red­nings­til­stand (en­kelt­bru­ger­til­stand), kan du blot bruge rescue i stedet for isolate rescue.target:

$ sudo systemctl rescue
bash

Du kan stoppe systemet ved at indtaste stop:

$ sudo systemctl stop
bash

Du kan starte en fuld­stæn­dig ned­luk­ning med poweroff:

$ sudo systemctl poweroff
bash

Du kan derimod starte en genstart med reboot:

$ sudo systemctl reboot
bash

Hvis du er logget ind, vil disse kom­man­do­er give dig op­lys­nin­ger om kommende be­gi­ven­he­der. Du får ikke disse op­lys­nin­ger ved blot at køre eller isolere målet. Det er vigtigt at vide, at mange computere forbinder de kortere kom­man­do­er til disse hand­lin­ger med systemd for at sikre korrekt udførelse.

Følgende kommando er normalt til­stræk­ke­lig til at genstarte systemet:

$ sudo reboot
bash
Gå til ho­ved­me­nu­en