Hur man använder systemctl för att hantera tjänster och enheter
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.servicebashEftersom 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 applicationbashFör att starta Apache-webbservern skriver du till exempel:
$ sudo systemctl start apache2bashOm du vill stoppa en tjänst som körs, använd stop:
$ sudo systemctl stop application.servicebashStarta 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.servicebashOm 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.servicebashOm 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.servicebashAktivera 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.servicebashNä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.servicebashFör att förhindra att en tjänst startar automatiskt vid uppstart, använd disable:
$ sudo systemctl disable application.servicebashDä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.servicebashDetta 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.servicebashDen 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.servicebashKommandot 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.servicebashOm 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-unitsbashNä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-foundellererror. - ACTIVE: Enhetens aktivitetsstatus, som kan växla mellan lägen som
active,inactive,activatingellerdeactivating - SUB: Den underordnade aktivitetsstatusen som ger ytterligare information om enhetens tillstånd (till exempel kan en
activeenhet ha en SUB-status pårunning,exitedellerfailed). - 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 --allbashUtmatningen 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=inactivebashDu 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=servicebashLista 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-filesbashKommandot 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.servicebashVisa 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.servicebashDet ä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.servicebashDetta 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.servicebashRedigering 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.servicebashVid 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.servicebashGenom 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.dbashEn helt reviderad enhetsfil kan raderas med följande kommando:
$ sudo rm /etc/systemd/system/nginx.servicebashEfter 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-reloadbashJustering 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.targetbashOm 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.targetbashLista ö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=targetbashDetta 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.targetbashOm 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.targetbashGenvä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 rescuebashDu kan stoppa systemet med stop:
$ sudo systemctl stopbashDu kan starta en fullständig avstängning med poweroff:
$ sudo systemctl poweroffbashÅ andra sidan kan du starta om med reboot:
$ sudo systemctl rebootbashOm 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 rebootbash
