I Linux spelar systemctl en central roll i administrationen av init-systemet och tjänstehanteraren systemd. Med systemctl har användarna kontroll över systemd-tjänster, dess enheter och konfigurationer, vilket gör det till ett oumbärligt verktyg för systemadministration. Från startkontroll till anpassning av systemtillstånd erbjuder systemctl ett omfattande utbud av funktioner.

Vad är systemctl?

systemctl är ett kommandoradsverktyg för hantering av systemd, ett init-system och systemhanterare för Linux-operativsystem. systemd är nu standardinit-systemet för flera Linux-distributioner och Linux-serverdistributioner såsom Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia och Gentoo. Det är dock inte implementerat universellt i alla distributioner.

I systemd-ekosystemet spelar systemctl en central roll i hanteringen av systemtjänster, konfiguration, startbeteende och systemunderhåll. Verktygets funktionalitet går utöver att bara starta och stoppa tjänster. Det erbjuder omfattande hantering av nästan alla aspekter av ett Linux-system.

I följande handledning hittar du praktiska kodexempel och Linux-kommandon för att använda systemctl. Exemplen nedan är baserade på Ubuntu 22.04.

Tjänstehantering

Det primära målet med init-systemet är att starta de komponenter som krävs efter uppstart av Linux-kärnan (userland -komponenter). Init-systemet används också för att effektivt styra tjänster och daemoner på en server när som helst under systemets drift.

Inom systemd fokuserar de flesta processer på resurser som hanteras av systemet. Dessa kallas enheter. Enheterna klassificeras efter vilken typ av resurs de representerar och definieras av enhetsfiler. Du kan känna igen enhetstypen på dess filändelse.

Vid hantering av tjänster är de tjänsteenheter som slutar med suffixet .service viktiga. Det är dock inte alltid nödvändigt att använda detta suffix för kommandon för tjänstehantering. systemd kan känna igen att sådana kommandon i allmänhet avser tjänster.

Starta och stoppa tjänster

En av de vanligaste uppgifterna som utförs under Linux med systemctl är att starta och stoppa tjänster. Dessa funktioner är grundläggande för systemadministration och gör det möjligt för dig att behålla kontrollen över de processer som körs på ett system. För att starta en tjänst använder du kommandot start. Om du arbetar som användare utan root-rättigheter måste du använda sudo.

$ sudo systemctl start application.service
bash

Eftersom systemd är utformat för att automatiskt söka efter .service-filer för tjänstehanteringskommandon, kan kommandot också anges i en förenklad form:

$ sudo systemctl start application
bash

För att starta Apache-webbservern skriver du till exempel:

$ sudo systemctl start apache2
bash

Om du vill stoppa en tjänst som körs, använd stop:

$ sudo systemctl stop application.service
bash

Starta om och ladda om

För att starta om en tjänst, vilket ofta är nödvändigt efter en konfigurationsändring, använder du kommandot restart:

$ sudo systemctl restart application.service
bash

Om ett program kan ladda om sina konfigurationsfiler utan att startas om kan kommandot reload användas för att starta processen:

$ sudo systemctl reload application.service
bash

Om du är osäker på om en tjänst erbjuder möjligheten att ladda om sin konfiguration kan du använda kommandot reload-or-restart. Detta laddar om konfigurationen om denna möjlighet stöds. Om den inte stöds startar kommandot om tjänsten för att initiera uppdateringen av konfigurationen.

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

Aktivera och inaktivera tjänster

Genom att aktivera och inaktivera tjänster kan du ange om en tjänst ska startas automatiskt när systemet startar. Detta är särskilt viktigt för systemets prestanda, säkerhet och hanteringen av beroenden mellan olika tjänster. Använd kommandot enable för att konfigurera automatisk aktivering vid systemstart:

$ sudo systemctl enable application.service
bash

När denna process utförs skapas en symbolisk länk. Denna länk kopplar samman kopian av systemtjänstfilen. Systemtjänstfilen finns vanligtvis under /lib/systemd/system eller /etc/systemd/system. Här hittar du också katalogen på hårddisken där systemd söker efter filer för autostart. Detta sker vanligtvis under /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

För att förhindra att en tjänst startar automatiskt vid uppstart, använd disable:

$ sudo systemctl disable application.service
bash

Därefter kommer den symboliska länken som anger automatisk aktivering vid start att raderas.

Varning: Att bara aktivera en tjänst startar inte den omedelbart i den aktuella sessionen. För att starta tjänsten omedelbart och konfigurera den så att den startar automatiskt vid uppstart måste du utföra både kommandot start och enable.

Kontrollera status för tjänster

systemctl gör det möjligt att visa information om tjänsternas status. Detta är särskilt användbart för att övervaka och diagnostisera den aktuella statusen för system- och applikationstjänster. Använd kommandot status för kontrollen:

$ systemctl status application.service
bash

Detta kommando ger en rad olika uppgifter, bland annat tjänstens aktuella status (aktiv, inaktiv, felaktig osv.), de senast utförda processerna och loggmeddelandena, cgroup-hierarkin och de första loggraderna.

För att kontrollera den aktuella aktivitetsstatusen för en tjänst under Linux med systemctl används is-active. Detta kommando anger om en tjänst för närvarande är aktiv eller inte:

$ systemctl is-active application.service
bash

Den aktuella statusen anges vanligtvis som active om tjänsten är aktiv, eller inactive om tjänsten är inaktiv.

För att kontrollera om en tjänst är konfigurerad för att aktiveras automatiskt vid systemstart kan du använda kommandot is-enabled. Detta är särskilt användbart för att hantera startkonfigurationen för tjänster på ett Linux-system.

$ systemctl is-enabled application.service
bash

Kommandot anger om tjänsten är aktiverad eller inaktiverad och ställer in avslutningskoden till “0” eller “1” baserat på svaret.

Du kan också använda kommandot is-failed för att kontrollera om en viss tjänst har ett felstatus:

$ systemctl is-failed application.service
bash

Om utförandet lyckas visas active. Om det uppstår ett fel visas failed. Om enheten stoppades avsiktligt kan unknown eller inactive visas som svar. En avslutningsstatus på 0 indikerar att ett fel har uppstått, medan 1 indikerar någon annan status.

Systemstatus

De kommandon som presenterats hittills har fokuserat på hantering av enskilda tjänster. Dessa kommandon ger dock ingen inblick i systemets aktuella status. Det finns en rad systemctl-kommandon som kan ge just denna typ av information.

list-units är användbart för att få en översikt över de aktuella enheterna på Linux:

$ systemctl list-units
bash

När du kör detta kommando visar systemctl en lista över enheter som hanteras av systemd. Utmatningen av denna lista innehåller olika kolumner med specifik information om varje enhet. Följande kolumner visas:

  • UNIT: Enhetens namn (detta hämtas ofta från enhetens filnamn, t.ex. sshd.service för SSH-daemonen
  • LOAD: Anger om enhetsfilen laddades korrekt; möjliga värden är loaded, not-found eller error.
  • ACTIVE: Enhetens aktivitetsstatus, som kan växla mellan lägen som active, inactive, activating eller deactivating
  • SUB: Den underordnade aktivitetsstatusen som ger ytterligare information om enhetens tillstånd (till exempel kan en active enhet ha en SUB-status på running, exited eller failed).
  • BESKRIVNING: En kort beskrivning av enheten, som ofta återspeglar enhetens syfte eller funktionalitet.

Kommandot visar dock som standard endast aktiva enheter. Av denna anledning visar kolumnen LOAD i utdata vanligtvis loaded och kolumnen ACTIVE active. Med ytterligare flaggor kan systemctl konfigureras så att det också visar ytterligare information. Om du till exempel använder flaggan --all visas alla enheter som laddats av systemd, oavsett deras aktuella aktivitetsstatus.

$ systemctl list-units --all
bash

Utmatningen kan vidare förfinas genom att använda ytterligare flaggor, såsom --state=, för att filtrera specifika tillstånd i kategorierna LOAD, ACTIVE eller SUB. Det är viktigt att behålla flaggan --all så att även inaktiva enheter visas:

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

Du kan också använda filtret --type= för att visa vissa typer av enheter, t.ex. om du bara vill se aktiva serviceenheter:

$ systemctl list-units --type=service
bash

Lista alla enhetsfiler

För att visa en lista över alla enhetsfiler på Linux med systemctl (inklusive de som systemd inte har försökt ladda) kan du använda list-unit-files. Detta kommando visar alla enhetsfiler som systemd känner till, inklusive tjänster, socklar, mål och mer.

$ systemctl list-units-files
bash

Kommandot visar olika tillstånd för enhetsfiler. Dessa tillstånd anger hur respektive enheter är konfigurerade, särskilt med avseende på deras beteende vid systemstart. De vanligaste tillstånden är

  • Aktiverad: Enheten är konfigurerad för att aktiveras automatiskt vid systemstart.
  • Inaktiverad: Enheten är inte konfigurerad för automatisk start under startprocessen.
  • Maskad: Enheten är helt inaktiverad så att den inte kan startas manuellt eller automatiskt.
  • Statisk: Enheten startas inte självständigt, utan är vanligtvis beroende av en annan enhet och startas endast i detta sammanhang.

Enhetsledning

En av systemctl:s huvuduppgifter är hantering av enheter. systemctl erbjuder en rad användbara kommandon och alternativ som gör det enklare att få specifik information om enskilda enheter och att hantera dem.

Visa en enhetsfil

Om du vill att innehållet i en specifik enhetsfil ska visas direkt i konsolen kan du använda kommandot cat. Om du till exempel vill visa enhetsfilen för en tjänst som ssh.service anger du:

$ systemctl cat ssh.service
bash

Visa beroenden

Om du använder list-dependencies visas beroenden för en specifik enhet i en trädstruktur. Kommandot ser ut så här:

$ systemctl list-dependencies sshd.service
bash

Det är standard att beroenden visas för .target enheter som representerar olika systemtillstånd. Använd flaggan --all för en komplett, rekursiv lista över alla beroenden.

För att visa omvända beroenden (dvs. enheter som är beroende av den angivna enheten) lägger du till --reverse i kommandot. Med flaggorna --before och —after kan du också se beroenden som startar före eller efter enheten i fråga.

Maskera och avmaska enheter

Att maskera en enhet inaktiverar den effektivt så att den inte kan startas manuellt eller automatiskt. Detta används ofta för att säkerställa att en tjänst eller enhet inte startas av misstag eller automatiskt av beroenden. Maskering görs genom att skapa en symbolisk länk från den relevanta enhetsfilen till /dev/null med kommandot mask:

$ sudo systemctl mask nginx.service
bash

Detta säkerställer att Nginx-tjänsten inte kan startas manuellt eller automatiskt medan den är i maskerat läge.

Avmaskering tar bort den maskerade statusen från en enhet så att den kan startas om normalt. Kommandot för avmaskering är unmask:

$ sudo systemctl unmask nginx.service
bash

Redigering av enhetsfiler

systemctl har alternativ för att anpassa och ändra enhetsfiler. Dessa funktioner introducerades i version 218 av systemd. Om du använder kommandot edit öppnas en enhetsfil i den valda enheten automatiskt för redigering:

$ sudo systemctl edit nginx.service
bash

Vid redigering skapas en tom fil för att lägga till eller ändra specifika instruktioner till en enhetsdefinition. För varje enhet (t.ex. nginx.service) skapas en undermapp i katalogen /etc/systemd/system med .d tillagt filnamnet. I exemplet ovan skulle undermappen vara nginx.service.d.

En override.conf-fil skapas i denna undermapp. När systemd laddar enheten kombinerar den innehållet i denna snippet-fil med den ursprungliga enhetsfilen. Här har instruktionerna i snippet prioritet. För att bearbeta hela enhetsfilen kan flaggan --full användas:

$ sudo systemctl edit --full nginx.service
bash

Genom att trycka på --full öppnas den befintliga enhetsfilen i en editor så att du kan göra ändringar. När du stänger editorn sparar systemet den redigerade filen i /etc/systemd/system.

För att ångra ändringar som du själv har gjort kan du antingen ta bort enhetens konfigurationskatalog .d eller den modifierade filen i /etc/systemd/system:

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

En helt reviderad enhetsfil kan raderas med följande kommando:

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

Efter att ha tagit bort filen eller katalogen måste du ladda om systemd så att det slutar referera till de borttagna filerna och istället återgår till systemets egen kopia:

$ sudo systemctl daemon-reload
bash

Justering av systemstatus (körnivå) med mål

systemd använder främst target för att gruppera olika enheter. Detta görs för att uppnå ett specifikt systemtillstånd, liknande runlevels i andra init-system. Filerna med suffixet .target fungerar som orienteringspunkter som anger tillgänglighetsstatus för vissa funktioner. Detta gör det möjligt för användare att ange det önskade övergripande tillståndet istället för de enskilda enheter som krävs.

Ett praktiskt exempel är swap.target, som markerar statusen för swap-beredskap. Enheter som är involverade i swap-processen kan anpassa sig till detta mål med hjälp av konfigurationsalternativ som WantedBy= eller RequiredBy=. Enheter som är beroende av swap kan å andra sidan ange detta med inställningar som Wants=, Requires= och After= för att uttrycka sitt beroende och startordning i förhållande till swappen.

Hämta och ställa in standarddestination

Genom att hämta och ställa in standardmålet kan du definiera ett standardläge för ditt system vid start. Så här hittar du standardmålet för ditt system:

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

Om du vill ändra standardmålet använder du kommandot set-default tillsammans med målets namn. Använd följande kommando för att ställa in standardmålet till graphical.target, vilket startar ett grafiskt användargränssnitt:

$ sudo systemctl set-default graphical.target
bash

Lista över tillgängliga destinationer

För att lista alla tillgängliga destinationer på ditt system kan du använda följande kommando:

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

Detta visar en lista över alla målenhetsfiler som är installerade på ditt system. Sökvägen och aktuell status (t.ex. aktiverad eller inaktiverad) visas för varje mål.

Isolera mål

Med isolate kan du samtidigt aktivera alla enheter som är anslutna till ett specifikt mål och stoppa alla andra enheter som inte är anslutna till det.

Låt oss anta att du arbetar i en miljö med aktiv graphical.target och vill växla till ett rent fleranvändarläge utan grafiskt användargränssnitt. I det här fallet kan du inaktivera det grafiska systemet genom att isolera multi-user.target. Eftersom graphical.target är beroende av multi-user.target, men inte tvärtom, stoppas alla grafiska tjänster vid växlingen.

Du bör dock kontrollera tillhörande beroenden innan du isolerar ett mål. Detta förhindrar att viktiga processer stoppas oavsiktligt.

$ systemctl list-dependencies multi-user.target
bash

Om du har kontrollerat de aktiva enheterna som du vill behålla och godkänner dem kan du isolera önskad destination:

$ sudo systemctl isolate multi-user.target
bash

Genvägar till viktiga evenemang

Det finns specifika mål för viktiga åtgärder som att stänga av eller starta om systemet. Under Linux erbjuder systemctl dock även praktiska genvägar som ger ytterligare funktioner. För att till exempel sätta systemet i räddningsläge (enanvändarläge) kan du helt enkelt använda rescue istället för isolate rescue.target:

$ sudo systemctl rescue
bash

Du kan stoppa systemet med stop:

$ sudo systemctl stop
bash

Du kan starta en fullständig avstängning med poweroff:

$ sudo systemctl poweroff
bash

Å andra sidan kan du starta om med reboot:

$ sudo systemctl reboot
bash

Om du är inloggad kommer dessa kommandon att informera dig om kommande händelser. Att bara utföra eller isolera målet ger dig inte denna information. Det är viktigt att veta att många datorer kopplar samman de kortare kommandona för dessa åtgärder med systemd för att säkerställa korrekt utförande.

Följande kommando räcker normalt för att starta om systemet:

$ sudo reboot
bash
Gå till huvudmeny