Sådan bruger du systemctl til at administrere tjenester og enheder
I Linux spiller systemctl en central rolle i administrationen af init-systemet og servicestyringssystemet systemd. Med systemctl har brugerne kontrol over systemd-tjenester, deres enheder og konfigurationer, hvilket gør det til et uundværligt værktøj til systemadministration. Fra styring af opstart til tilpasning af systemtilstande tilbyder systemctl en bred vifte af funktioner.
Hvad er systemctl?
systemctl er et kommandolinjeværktøj til administration af systemd, et init-system og en systemadministrator til Linux-operativsystemer. systemd er i dag standard-init-systemet i flere Linux-distributioner og Linux-serverdistributioner, såsom Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia og Gentoo. Det er dog ikke implementeret i alle distributioner.
I systemd-økosystemet spiller systemctl en central rolle i administrationen af systemtjenester, konfiguration, opstartsadfærd og systemvedligeholdelse. Værktøjets funktionalitet rækker langt ud over blot at starte og stoppe tjenester. Det giver mulighed for omfattende administration af næsten alle aspekter af et Linux-system.
I denne vejledning finder du praktiske kodeeksempler og Linux-kommandoer til brug af systemctl. Eksemplerne nedenfor er baseret på Ubuntu 22.04.
Servicestyring
Hovedformålet med init-systemet er at starte de komponenter, der er nødvendige efter opstart af Linux-kernen (brugergrænsefladekomponenter). 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å ressourcer, der administreres af systemet. Disse kaldes enheder. Enhederne klassificeres efter den type ressource, de repræsenterer, og defineres via enhedsfiler. Du kan genkende enhedstypen på filtypen.
Når man administrerer tjenester, er de tjenesteenheder, der slutter med endelsen .service, vigtige. Det er dog ikke altid nødvendigt at bruge denne endelse i kommandoer til tjenesteadministration. systemd kan genkende, at sådanne kommandoer generelt henviser til tjenester.
Start og stop tjenester
En af de mest almindelige opgaver, der udføres under Linux med systemctl, er at starte og stoppe tjenester. Disse funktioner er afgørende for systemadministration og giver dig mulighed for at bevare kontrollen over de processer, der kører på systemet. For at starte en tjeneste skal du bruge kommandoen start. Hvis du arbejder som bruger uden root-rettigheder, skal du bruge sudo.
$ sudo systemctl start application.servicebashDa systemd er udviklet til automatisk at søge efter .service -filer til kommandoer til tjenestestyring, kan kommandoen også indtastes i en forenklet form:
$ sudo systemctl start applicationbashHvis du f.eks. vil starte Apache-webserveren, skal du skrive:
$ sudo systemctl start apache2bashHvis du vil stoppe en kørende tjeneste, skal du bruge stop:
$ sudo systemctl stop application.servicebashGenstart og genindlæs
For at genstarte en tjeneste, hvilket ofte er nødvendigt efter en konfigurationsændring, skal du bruge kommandoen restart:
$ sudo systemctl restart application.servicebashHvis et program kan genindlæse sine konfigurationsfiler uden at genstarte, kan kommandoen reload bruges til at starte processen:
$ sudo systemctl reload application.servicebashHvis du er i tvivl om, hvorvidt en tjeneste understøtter genindlæsning af konfigurationen, kan du bruge kommandoen reload-or-restart. Dette vil genindlæse konfigurationen, hvis denne funktion understøttes. Hvis den ikke understøttes, vil kommandoen genstarte tjenesten for at igangsætte konfigurationsopdateringen.
$ sudo systemctl reload-or-restart application.servicebashAktivér og deaktiver tjenester
Ved at aktivere og deaktivere tjenester kan du angive, om en tjeneste skal startes automatisk, når systemet starter op. Dette er især vigtigt for systemets ydeevne, sikkerheden og styringen af afhængigheder mellem forskellige tjenester. Brug kommandoen enable til at konfigurere automatisk aktivering ved systemstart:
$ sudo systemctl enable application.servicebashNår denne proces udføres, oprettes der et symbolsk link. Dette link forbinder kopien af systemtjenestefilen. Systemtjenestefilen findes normalt under /lib/systemd/system eller /etc/systemd/system. Her finder du også den mappe på harddisken, hvor systemd søger efter filer til autostart. Dette sker normalt under /etc/systemd/system/some_target.target.wants.
$ sudo systemctl enable application.servicebashFor at forhindre, at en tjeneste starter automatisk ved opstart, skal du bruge disable:
$ sudo systemctl disable application.servicebashHerefter slettes det symbolske link, der angiver automatisk aktivering 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 automatisk ved opstart skal du udføre både kommando start og enable.
Tjek status for tjenesterne
Med systemctl kan man få vist oplysninger om tjenesternes status. Dette er især nyttigt til overvågning og fejlfinding af den aktuelle status for system- og programtjenester. Brug kommandoen status til at tjekke:
$ systemctl status application.servicebashDenne kommando giver en række oplysninger, herunder tjenestens aktuelle status (aktiv, inaktiv, fejlbehæftet osv.), de senest udførte processer og logmeddelelser, cgroup-hierarkiet samt de første loglinjer.
For at kontrollere den aktuelle aktivitetsstatus for en tjeneste under Linux med systemctl bruges is-active. Denne kommando angiver, om en tjeneste i øjeblikket er aktiv eller ej:
$ systemctl is-active application.servicebashDen aktuelle status angives normalt som active, hvis tjenesten er aktiv, eller inactive, hvis tjenesten er inaktiv.
For at kontrollere, om en tjeneste er konfigureret til automatisk at blive aktiveret ved systemstart, kan du bruge kommandoen is-enabled. Dette er især nyttigt til at administrere startkonfigurationen af tjenester på et Linux-system.
$ systemctl is-enabled application.servicebashKommandoen angiver, om tjenesten er aktiveret eller deaktiveret, og indstiller afslutningskoden til henholdsvis ’0’ eller ’1’ afhængigt af svaret.
Du kan også bruge kommandoen is-failed til at kontrollere, om en bestemt tjeneste har en fejlstatus:
$ systemctl is-failed application.servicebashHvis udførelsen lykkes, vises active. Hvis der opstår en fejl, vises failed. Hvis enheden blev stoppet bevidst, kan unknown eller inactive vises som svar. En afslutningsstatus på 0 angiver, at der er opstået en fejl, mens 1 angiver en anden status.
Systemstatus
De kommandoer, der er blevet gennemgået indtil nu, har fokuseret på administrationen af de enkelte tjenester. Disse kommandoer giver dog ikke indsigt i systemets aktuelle status. Der findes en række systemctl-kommandoer, der netop kan levere denne type information.
list-units er et nyttigt værktøj til at få et overblik over de aktuelle enheder i Linux:
$ systemctl list-unitsbashNår du kører denne kommando, viser systemctl en liste over de enheder, der administreres af systemd. Listen indeholder forskellige kolonner med specifikke oplysninger 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 enhedsfilen blev indlæst korrekt; mulige værdier er
loaded,not-foundellererror. - ACTIVE: Enhedens aktivitetsstatus, som kan skifte mellem tilstande såsom
active,inactive,activatingellerdeactivating - SUB: Den underordnede aktivitetsstatus, der giver yderligere detaljer om enhedens tilstand (For eksempel kan en
activehave en SUB-status pårunning,exitedellerfailed.) - DESCRIPTION: En kort beskrivelse af enheden, der ofte afspejler enhedens formål eller funktionalitet
Kommandoen viser dog som standard kun aktive enheder. Af denne grund viser kolonnen LOAD i udskriften typisk loaded, mens kolonnen ACTIVE viser active. Ved hjælp af yderligere flag kan systemctl konfigureres til også at vise yderligere oplysninger. Hvis man f.eks. bruger flaget --all, vises alle enheder, der er indlæst af systemd, uanset deres aktuelle aktivitetsstatus.
$ systemctl list-units --allbashResultatet kan yderligere finjusteres ved hjælp af yderligere flag, f.eks. --state=, til at filtrere efter bestemte tilstande i kategorierne LOAD, ACTIVE eller SUB. Det er vigtigt at beholde flag --all, så inaktive enheder også vises:
$ systemctl list-units --all --state=inactivebashDu 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=servicebashVis alle enhedsfiler
For at få vist en liste over alle enhedsfiler 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 enhedsfiler, som systemd har kendskab til, herunder tjenester, sockets, mål og mere.
$ systemctl list-units-filesbashKommandoen viser forskellige tilstande for enhedsfiler. Disse tilstande angiver, hvordan de pågældende enheder er konfigureret, især med hensyn til deres adfærd ved systemstart. De mest almindelige tilstande er
- Aktiveret: Enheden er konfigureret til at blive aktiveret automatisk ved systemstart.
- Deaktiveret: Enheden er ikke konfigureret til automatisk opstart under boot-processen.
- Maskeret: Enheden er fuldstændigt deaktiveret, så den hverken kan startes manuelt eller automatisk.
- Statisk: Enheden startes ikke uafhængigt, men afhænger typisk af en anden enhed og startes kun i denne sammenhæng.
Afdelingsledelse
En af systemctls vigtigste opgaver er administrationen af enheder. systemctl tilbyder en række nyttige kommandoer og indstillinger, der gør det nemmere at få specifikke oplysninger om de enkelte enheder og at administrere dem.
Vis en enhedsfil
Hvis du ønsker, at indholdet af en bestemt enhedsfil skal vises direkte i konsollen, kan du bruge kommandoen cat. Hvis du f.eks. vil se enhedsfilen for en tjeneste som ssh.service, skal du indtaste:
$ systemctl cat ssh.servicebashVis afhængigheder
Hvis du bruger list-dependencies, vises afhængighederne for en bestemt enhed i en træstruktur. Kommandoen ser således ud:
$ systemctl list-dependencies sshd.servicebashSom standard vises afhængighederne for .target enheder, der repræsenterer forskellige systemtilstande. Brug flagget --all for at få en komplet, rekursiv liste over alle afhængigheder.
For at få vist omvendte afhængigheder (dvs. enheder, der afhænger af den angivne enhed) skal du tilføje --reverse til kommandoen. Med flagene --before og —after kan du også se de afhængigheder, der starter før eller efter den pågældende enhed.
Skjul og vis enheder
Når man maskerer en enhed, deaktiveres den reelt, så den hverken kan startes manuelt eller automatisk. Dette bruges ofte til at sikre, at en tjeneste eller en enhed ikke startes ved et uheld eller automatisk på grund af afhængigheder. Maskering sker ved at oprette et symbolsk link fra den relevante enhedsfil til /dev/null ved hjælp af kommandoen mask:
$ sudo systemctl mask nginx.servicebashDette sikrer, at Nginx-tjenesten ikke kan startes manuelt eller automatisk, mens den er i maskeret tilstand.
Fjernelse af maskering ophæver en enheds maskerede status, så den igen kan startes normalt. Kommandoen til fjernelse af maskering er unmask:
$ sudo systemctl unmask nginx.servicebashRedigering af enhedsfiler
systemctl har funktioner til at tilpasse og ændre enhedsfiler. Disse funktioner blev introduceret med version 218 af systemd. Hvis du bruger kommandoen edit, åbnes en enhedsfil i den valgte enhed automatisk, så du kan redigere den:
$ sudo systemctl edit nginx.servicebashNår man redigerer, oprettes der en tom fil, hvor man kan tilføje eller ændre specifikke instruktioner til en enhedsdefinition. For hver enhed (f.eks. nginx.service) oprettes der en undermappe i mappen /etc/systemd/system, hvor filnavnet får tilføjet endelsen .d. I eksemplet ovenfor vil undermappen hedde nginx.service.d.
Der oprettes en override.conf-fil i denne undermappe. Når systemd indlæser enheden, kombinerer det indholdet af denne fil med den oprindelige enhedsfil. Her har instruktionerne i denne fil forrang. For at behandle hele enhedsfilen kan flagget --full bruges:
$ sudo systemctl edit --full nginx.servicebashHvis du trykker på --full, åbnes den eksisterende enhedsfil i et redigeringsprogram, så du kan foretage ændringer. Når du lukker redigeringsprogrammet, gemmer systemet den redigerede fil i /etc/systemd/system.
Hvis du vil fortryde ændringer, du selv har foretaget, kan du enten slette enhedens konfigurationsmappe .d eller den ændrede fil i /etc/systemd/system:
$ sudo rm -r /etc/systemd/system/nginx.service.dbashEn fuldstændig revideret enhedsfil kan slettes med følgende kommando:
$ sudo rm /etc/systemd/system/nginx.servicebashNå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-reloadbashJustering af systemtilstand (kørselstilstand) med mål
systemd bruger primært »target« til at samle forskellige enheder i grupper. Dette gøres for at opnå en bestemt systemtilstand, svarende til runlevels i andre init-systemer. Filerne med filtypen .target fungerer som orienteringspunkter, der angiver, om bestemte funktioner er tilgængelige. Dette giver brugerne mulighed for at angive den ønskede overordnede tilstand i stedet for de enkelte enheder, der kræves.
Et konkret eksempel er swap.target, som angiver, at enheden er klar til udskiftning. Enheder, der indgår i udskiftningsprocessen, kan tilpasse sig dette mål ved hjælp af konfigurationsindstillinger som WantedBy= eller RequiredBy=. Enheder, der er afhængige af udskiftningen, kan derimod angive dette med indstillinger som Wants=, Requires= og After= for at udtrykke deres afhængighed og startsekvens i forhold til udskiftningen.
Hent og konfigurer standarddestination
Ved at hente og konfigurere standardmålet kan du definere en standardtilstand for dit system ved opstart. Sådan finder du standardmålet for dit system:
$ systemctl get-default
Output
multi-user.targetbashHvis du vil ændre standardmålet, skal du bruge kommandoen set-default sammen med navnet på målet. Brug følgende kommando til at indstille standardmålet til graphical.target, hvilket starter en grafisk brugergrænseflade:
$ sudo systemctl set-default graphical.targetbashVis tilgængelige destinationer
For at få vist alle de destinationer, der er tilgængelige på dit system, kan du bruge følgende kommando:
$ systemctl list-unit-files --type=targetbashHer vises en liste over alle målenhedsfiler, der er installeret på dit system. Der vises sti og aktuel status (f.eks. aktiveret eller deaktiveret) 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 deaktivere 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 flerbrugertilstand uden grafisk brugergrænseflade. I dette tilfælde kan du deaktivere 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 kontrollere de tilknyttede afhængigheder, før du isolerer et mål. På den måde undgår du, at vigtige processer uforvarende stoppes.
$ systemctl list-dependencies multi-user.targetbashHvis du har markeret de aktive enheder, du vil beholde, og er enig i valget, kan du angive den ønskede destination:
$ sudo systemctl isolate multi-user.targetbashGenveje til vigtige begivenheder
Der findes specifikke kommandoer til vigtige handlinger som f.eks. at lukke systemet ned eller genstarte det. Under Linux tilbyder systemctl dog også praktiske genveje, der giver adgang til yderligere funktioner. Hvis du f.eks. vil sætte systemet i redningstilstand (enkeltbrugertilstand), kan du blot bruge rescue i stedet for isolate rescue.target:
$ sudo systemctl rescuebashDu kan stoppe systemet ved at indtaste stop:
$ sudo systemctl stopbashDu kan starte en fuldstændig nedlukning med poweroff:
$ sudo systemctl poweroffbashDu kan derimod starte en genstart med reboot:
$ sudo systemctl rebootbashHvis du er logget ind, vil disse kommandoer give dig oplysninger om kommende begivenheder. Du får ikke disse oplysninger ved blot at køre eller isolere målet. Det er vigtigt at vide, at mange computere forbinder de kortere kommandoer til disse handlinger med systemd for at sikre korrekt udførelse.
Følgende kommando er normalt tilstrækkelig til at genstarte systemet:
$ sudo rebootbash