I Linux spelar systemctl en central roll i ad­mi­nist­ra­tio­nen av init-systemet och tjäns­te­han­te­ra­ren systemd. Med systemctl har an­vän­dar­na kontroll över systemd-tjänster, dess enheter och kon­fi­gu­ra­tio­ner, vilket gör det till ett oum­bär­ligt verktyg för sys­te­mad­mi­nist­ra­tion. Från start­kon­troll till an­pass­ning av system­till­stånd erbjuder systemctl ett om­fat­tan­de utbud av funk­tio­ner.

Vad är systemctl?

systemctl är ett kom­man­do­rads­verk­tyg för hantering av systemd, ett init-system och system­han­te­ra­re för Linux-ope­ra­tiv­sy­stem. systemd är nu stan­dar­di­nit-systemet för flera Linux-dis­tri­bu­tio­ner och Linux-ser­ver­dis­tri­bu­tio­ner såsom Ubuntu, Debian, Fedora, Red Hat En­ter­pri­se Linux (RHEL), CentOS, Arch Linux, Mageia och Gentoo. Det är dock inte im­ple­men­te­rat uni­ver­sellt i alla dis­tri­bu­tio­ner.

I systemd-eko­sy­ste­met spelar systemctl en central roll i han­te­ring­en av system­tjäns­ter, kon­fi­gu­ra­tion, start­be­te­en­de och systemun­der­håll. Verk­ty­gets funk­tio­na­li­tet går utöver att bara starta och stoppa tjänster. Det erbjuder om­fat­tan­de hantering av nästan alla aspekter av ett Linux-system.

I följande hand­led­ning hittar du praktiska ko­dex­em­pel och Linux-kommandon för att använda systemctl. Exemplen nedan är baserade på Ubuntu 22.04.

Tjäns­te­han­te­ring

Det primära målet med init-systemet är att starta de kom­po­nen­ter som krävs efter uppstart av Linux-kärnan (userland -kom­po­nen­ter). 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 klas­si­fi­ce­ras efter vilken typ av resurs de re­pre­sen­te­rar och de­fi­nie­ras av en­hets­fi­ler. Du kan känna igen en­hets­ty­pen på dess fi­län­del­se.

Vid hantering av tjänster är de tjäns­te­en­he­ter som slutar med suffixet .service viktiga. Det är dock inte alltid nöd­vän­digt att använda detta suffix för kommandon för tjäns­te­han­te­ring. systemd kan känna igen att sådana kommandon i allmänhet avser tjänster.

Starta och stoppa tjänster

En av de van­li­gas­te upp­gif­ter­na som utförs under Linux med systemctl är att starta och stoppa tjänster. Dessa funk­tio­ner är grund­läg­gan­de för sys­te­mad­mi­nist­ra­tion och gör det möjligt för dig att behålla kon­trol­len ö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ät­tig­he­ter måste du använda sudo.

$ sudo systemctl start application.service
bash

Eftersom systemd är utformat för att au­to­ma­tiskt söka efter .service-filer för tjäns­te­han­te­rings­kom­man­don, kan kommandot också anges i en förenklad form:

$ sudo systemctl start application
bash

För att starta Apache-webb­ser­vern 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öd­vän­digt efter en kon­fi­gu­ra­tions­änd­ring, använder du kommandot restart:

$ sudo systemctl restart application.service
bash

Om ett program kan ladda om sina kon­fi­gu­ra­tions­fi­ler 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öj­lig­he­ten att ladda om sin kon­fi­gu­ra­tion kan du använda kommandot reload-or-restart. Detta laddar om kon­fi­gu­ra­tio­nen om denna möjlighet stöds. Om den inte stöds startar kommandot om tjänsten för att initiera upp­da­te­ring­en av kon­fi­gu­ra­tio­nen.

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

Aktivera och in­ak­ti­ve­ra tjänster

Genom att aktivera och in­ak­ti­ve­ra tjänster kan du ange om en tjänst ska startas au­to­ma­tiskt när systemet startar. Detta är särskilt viktigt för systemets prestanda, säkerhet och han­te­ring­en av beroenden mellan olika tjänster. Använd kommandot enable för att kon­fi­gu­re­ra au­to­ma­tisk ak­ti­ve­ring 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 system­tjänst­fi­len. System­tjänst­fi­len finns van­ligt­vis under /lib/systemd/system eller /etc/systemd/system. Här hittar du också katalogen på hård­dis­ken där systemd söker efter filer för autostart. Detta sker van­ligt­vis under /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

För att förhindra att en tjänst startar au­to­ma­tiskt vid uppstart, använd disable:

$ sudo systemctl disable application.service
bash

Därefter kommer den sym­bo­lis­ka länken som anger au­to­ma­tisk ak­ti­ve­ring vid start att raderas.

Varning: Att bara aktivera en tjänst startar inte den ome­del­bart i den aktuella sessionen. För att starta tjänsten ome­del­bart och kon­fi­gu­re­ra den så att den startar au­to­ma­tiskt vid uppstart måste du utföra både kommandot start och enable.

Kon­trol­le­ra status för tjänster

systemctl gör det möjligt att visa in­for­ma­tion om tjäns­ter­nas status. Detta är särskilt an­vänd­bart för att övervaka och di­a­gnos­ti­se­ra den aktuella statusen för system- och ap­pli­ka­tions­tjäns­ter. Använd kommandot status för kon­trol­len:

$ 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 pro­ces­ser­na och logg­med­de­lan­de­na, cgroup-hierarkin och de första log­gra­der­na.

För att kon­trol­le­ra den aktuella ak­ti­vi­tets­sta­tu­sen för en tjänst under Linux med systemctl används is-active. Detta kommando anger om en tjänst för när­va­ran­de är aktiv eller inte:

$ systemctl is-active application.service
bash

Den aktuella statusen anges van­ligt­vis som active om tjänsten är aktiv, eller inactive om tjänsten är inaktiv.

För att kon­trol­le­ra om en tjänst är kon­fi­gu­re­rad för att aktiveras au­to­ma­tiskt vid systemstart kan du använda kommandot is-enabled. Detta är särskilt an­vänd­bart för att hantera start­kon­fi­gu­ra­tio­nen för tjänster på ett Linux-system.

$ systemctl is-enabled application.service
bash

Kommandot anger om tjänsten är aktiverad eller in­ak­ti­ve­rad och ställer in av­slut­nings­ko­den till “0” eller “1” baserat på svaret.

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

$ systemctl is-failed application.service
bash

Om ut­fö­ran­det lyckas visas active. Om det uppstår ett fel visas failed. Om enheten stoppades av­sikt­ligt kan unknown eller inactive visas som svar. En av­slut­nings­sta­tus på 0 indikerar att ett fel har uppstått, medan 1 indikerar någon annan status.

Systemsta­tus

De kommandon som pre­sen­te­rats 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 in­for­ma­tion.

list-units är an­vänd­bart 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. Ut­mat­ning­en av denna lista in­ne­hål­ler olika kolumner med specifik in­for­ma­tion 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 en­hets­fi­len laddades korrekt; möjliga värden är loaded, not-found eller error.
  • ACTIVE: Enhetens ak­ti­vi­tets­sta­tus, som kan växla mellan lägen som active, inactive, activating eller deactivating
  • SUB: Den un­der­ord­na­de ak­ti­vi­tets­sta­tu­sen som ger yt­ter­li­ga­re in­for­ma­tion om enhetens tillstånd (till exempel kan en active enhet ha en SUB-status på running, exited eller failed).
  • BE­SKRIV­NING: En kort be­skriv­ning av enheten, som ofta åter­speg­lar enhetens syfte eller funk­tio­na­li­tet.

Kommandot visar dock som standard endast aktiva enheter. Av denna anledning visar kolumnen LOAD i utdata van­ligt­vis loaded och kolumnen ACTIVE active. Med yt­ter­li­ga­re flaggor kan systemctl kon­fi­gu­re­ras så att det också visar yt­ter­li­ga­re in­for­ma­tion. Om du till exempel använder flaggan --all visas alla enheter som laddats av systemd, oavsett deras aktuella ak­ti­vi­tets­sta­tus.

$ systemctl list-units --all
bash

Ut­mat­ning­en kan vidare förfinas genom att använda yt­ter­li­ga­re flaggor, såsom --state=, för att filtrera specifika tillstånd i ka­te­go­ri­er­na 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 ser­vice­en­he­ter:

$ systemctl list-units --type=service
bash

Lista alla en­hets­fi­ler

För att visa en lista över alla en­hets­fi­ler 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 en­hets­fi­ler 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 en­hets­fi­ler. Dessa tillstånd anger hur re­spek­ti­ve enheter är kon­fi­gu­re­ra­de, särskilt med avseende på deras beteende vid systemstart. De van­li­gas­te till­stån­den är

  • Aktiverad: Enheten är kon­fi­gu­re­rad för att aktiveras au­to­ma­tiskt vid systemstart.
  • In­ak­ti­ve­rad: Enheten är inte kon­fi­gu­re­rad för au­to­ma­tisk start under start­pro­ces­sen.
  • Maskad: Enheten är helt in­ak­ti­ve­rad så att den inte kan startas manuellt eller au­to­ma­tiskt.
  • Statisk: Enheten startas inte själv­stän­digt, utan är van­ligt­vis beroende av en annan enhet och startas endast i detta sam­man­hang.

En­hets­led­ning

En av systemctl:s hu­vud­upp­gif­ter är hantering av enheter. systemctl erbjuder en rad an­vänd­ba­ra kommandon och al­ter­na­tiv som gör det enklare att få specifik in­for­ma­tion om enskilda enheter och att hantera dem.

Visa en enhetsfil

Om du vill att in­ne­hål­let i en specifik enhetsfil ska visas direkt i konsolen kan du använda kommandot cat. Om du till exempel vill visa en­hets­fi­len 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äd­struk­tur. Kommandot ser ut så här:

$ systemctl list-dependencies sshd.service
bash

Det är standard att beroenden visas för .target enheter som re­pre­sen­te­rar olika system­till­stå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 in­ak­ti­ve­rar den effektivt så att den inte kan startas manuellt eller au­to­ma­tiskt. Detta används ofta för att sä­ker­stäl­la att en tjänst eller enhet inte startas av misstag eller au­to­ma­tiskt av beroenden. Maskering görs genom att skapa en symbolisk länk från den relevanta en­hets­fi­len till /dev/null med kommandot mask:

$ sudo systemctl mask nginx.service
bash

Detta sä­ker­stäl­ler att Nginx-tjänsten inte kan startas manuellt eller au­to­ma­tiskt medan den är i maskerat läge.

Av­mas­ke­ring tar bort den maskerade statusen från en enhet så att den kan startas om normalt. Kommandot för av­mas­ke­ring är unmask:

$ sudo systemctl unmask nginx.service
bash

Re­di­ge­ring av en­hets­fi­ler

systemctl har al­ter­na­tiv för att anpassa och ändra en­hets­fi­ler. Dessa funk­tio­ner in­tro­du­ce­ra­des i version 218 av systemd. Om du använder kommandot edit öppnas en enhetsfil i den valda enheten au­to­ma­tiskt för re­di­ge­ring:

$ sudo systemctl edit nginx.service
bash

Vid re­di­ge­ring skapas en tom fil för att lägga till eller ändra specifika in­struk­tio­ner till en en­hets­de­fi­ni­tion. För varje enhet (t.ex. nginx.service) skapas en undermapp i katalogen /etc/systemd/system med .d tillagt filnamnet. I exemplet ovan skulle un­der­map­pen vara nginx.service.d.

En override.conf-fil skapas i denna undermapp. När systemd laddar enheten kom­bi­ne­rar den in­ne­hål­let i denna snippet-fil med den ur­sprung­li­ga en­hets­fi­len. Här har in­struk­tio­ner­na i snippet prioritet. För att bearbeta hela en­hets­fi­len kan flaggan --full användas:

$ sudo systemctl edit --full nginx.service
bash

Genom att trycka på --full öppnas den be­fint­li­ga en­hets­fi­len i en editor så att du kan göra ändringar. När du stänger editorn sparar systemet den re­di­ge­ra­de filen i /etc/systemd/system.

För att ångra ändringar som du själv har gjort kan du antingen ta bort enhetens kon­fi­gu­ra­tions­ka­ta­log .d eller den mo­di­fi­e­ra­de 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 systemsta­tus (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 system­till­stånd, liknande runlevels i andra init-system. Filerna med suffixet .target fungerar som ori­en­te­rings­punk­ter som anger till­gäng­lig­hets­sta­tus för vissa funk­tio­ner. Detta gör det möjligt för användare att ange det önskade över­gri­pan­de till­stån­det 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 in­vol­ve­ra­de i swap-processen kan anpassa sig till detta mål med hjälp av kon­fi­gu­ra­tions­al­ter­na­tiv som WantedBy= eller RequiredBy=. Enheter som är beroende av swap kan å andra sidan ange detta med in­ställ­ning­ar som Wants=, Requires= och After= för att uttrycka sitt beroende och star­t­ord­ning i för­hål­lan­de till swappen.

Hämta och ställa in stan­dard­des­ti­na­tion

Genom att hämta och ställa in stan­dard­må­let kan du definiera ett stan­dard­lä­ge för ditt system vid start. Så här hittar du stan­dard­må­let för ditt system:

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

Om du vill ändra stan­dard­må­let använder du kommandot set-default till­sam­mans med målets namn. Använd följande kommando för att ställa in stan­dard­må­let till graphical.target, vilket startar ett grafiskt an­vän­dar­gräns­snitt:

$ sudo systemctl set-default graphical.target
bash

Lista över till­gäng­li­ga des­ti­na­tio­ner

För att lista alla till­gäng­li­ga des­ti­na­tio­ner på ditt system kan du använda följande kommando:

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

Detta visar en lista över alla må­len­hets­fi­ler som är in­stal­le­ra­de på ditt system. Sökvägen och aktuell status (t.ex. aktiverad eller in­ak­ti­ve­rad) 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 fle­ran­vän­dar­lä­ge utan grafiskt an­vän­dar­gräns­snitt. I det här fallet kan du in­ak­ti­ve­ra 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 kon­trol­le­ra till­hö­ran­de beroenden innan du isolerar ett mål. Detta för­hind­rar att viktiga processer stoppas oav­sikt­ligt.

$ systemctl list-dependencies multi-user.target
bash

Om du har kon­trol­le­rat de aktiva enheterna som du vill behålla och godkänner dem kan du isolera önskad des­ti­na­tion:

$ 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 yt­ter­li­ga­re funk­tio­ner. För att till exempel sätta systemet i rädd­nings­lä­ge (enan­vän­dar­lä­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 full­stän­dig av­stäng­ning 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 in­for­ma­tion. Det är viktigt att veta att många datorer kopplar samman de kortare kom­man­do­na för dessa åtgärder med systemd för att sä­ker­stäl­la korrekt utförande.

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

$ sudo reboot
bash
Gå till huvudmeny