In Linux speelt systemctl een centrale rol in het beheer van het init-systeem en het ser­vi­cema­na­ge­ment­sys­teem systemd. Met systemctl hebben ge­brui­kers controle over systemd-services, de bij­be­ho­ren­de units en con­fi­gu­ra­ties, waardoor het een onmisbaar hulp­mid­del is voor sys­teem­be­heer. Van op­start­con­tro­le tot het aanpassen van sys­teem­sta­tus­sen: systemctl biedt een uit­ge­brei­de reeks functies.

Wat is systemctl?

systemctl is een op­dracht­re­gel­pro­gram­ma voor het beheer van systemd, een init-systeem en sys­teem­be­heer­der voor Linux-be­stu­rings­sys­te­men. systemd is nu het standaard init-systeem voor ver­schil­len­de Linux-dis­tri­bu­ties en Linux-ser­ver­dis­tri­bu­ties, zoals Ubuntu, Debian, Fedora, Red Hat En­ter­pri­se Linux (RHEL), CentOS, Arch Linux, Mageia en Gentoo. Het is echter niet in alle dis­tri­bu­ties ge­ïm­ple­men­teerd.

In het systemd-eco­sys­teem speelt systemctl een centrale rol in het beheer van sys­teem­ser­vi­ces, con­fi­gu­ra­tie, op­start­ge­drag en sys­teem­on­der­houd. De func­ti­o­na­li­teit van de tool gaat verder dan alleen het starten en stoppen van services. Het biedt uit­ge­breid beheer over bijna alle aspecten van een Linux-systeem.

In de volgende tutorial vindt u prak­ti­sche co­de­voor­beel­den en Linux-commando’s voor het gebruik van systemctl. De on­der­staan­de voor­beel­den zijn gebaseerd op Ubuntu 22.04.

Ser­vi­cema­na­ge­ment

Het primaire doel van het init-systeem is het starten van de com­po­nen­ten die nodig zijn na het opstarten van de Linux-kernel (userland -com­po­nen­ten). Het init-systeem wordt ook gebruikt om services en daemons op een server op elk moment tijdens het draaien van het systeem effectief te beheren.

Binnen systemd richten de meeste processen zich op bronnen die door het systeem worden beheerd. Deze worden units genoemd. Deze units worden ingedeeld op basis van het type bron dat ze ver­te­gen­woor­di­gen en worden ge­de­fi­ni­eerd door unit­be­stan­den. U kunt het type unit herkennen aan de be­stands­ex­ten­sie.

Bij het beheer van services zijn de service-eenheden die eindigen op het ach­ter­voeg­sel .service be­lang­rijk. Het is echter niet altijd nodig om dit ach­ter­voeg­sel te gebruiken voor commando’s voor ser­vi­ce­be­heer. systemd kan herkennen dat der­ge­lij­ke commando’s over het algemeen verwijzen naar services.

Services starten en stoppen

Een van de meest voor­ko­men­de taken die onder Linux met systemctl worden uit­ge­voerd, is het starten en stoppen van services. Deze functies zijn van fun­da­men­teel belang voor sys­teem­be­heer en stellen u in staat controle te houden over de processen die op een systeem worden uit­ge­voerd. Gebruik het commando start om een service te starten. Als u werkt als een gebruiker zonder root­rech­ten, moet u sudo gebruiken.

$ sudo systemctl start application.service
bash

Aangezien systemd is ontworpen om au­to­ma­tisch te zoeken naar .service-bestanden voor ser­vi­ce­be­heer­op­drach­ten, kan de opdracht ook in een ver­een­vou­dig­de vorm worden ingevoerd:

$ sudo systemctl start application
bash

Om bij­voor­beeld de Apache-webserver te starten, voert u het volgende in:

$ sudo systemctl start apache2
bash

Als u een actieve service wilt stoppen, gebruikt u stop:

$ sudo systemctl stop application.service
bash

Opnieuw opstarten en opnieuw laden

Om een service opnieuw te starten, wat vaak nodig is na een con­fi­gu­ra­tie­wij­zi­ging, gebruikt u het commando restart:

$ sudo systemctl restart application.service
bash

Als een ap­pli­ca­tie zijn con­fi­gu­ra­tie­be­stan­den kan herladen zonder opnieuw op te starten, kan het commando reload worden gebruikt om het proces te starten:

$ sudo systemctl reload application.service
bash

Als u niet zeker weet of een service de mo­ge­lijk­heid biedt om de con­fi­gu­ra­tie opnieuw te laden, kunt u het commando reload-or-restart gebruiken. Hiermee wordt de con­fi­gu­ra­tie opnieuw geladen als deze optie wordt on­der­steund. Als dit niet wordt on­der­steund, zal het commando de service opnieuw opstarten om de con­fi­gu­ra­tie-update te starten.

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

Diensten activeren en de­ac­ti­ve­ren

Door services te activeren en de­ac­ti­ve­ren, kunt u aangeven of een service au­to­ma­tisch moet worden gestart wanneer het systeem opstart. Dit is met name be­lang­rijk voor de sys­teem­pres­ta­ties, de be­vei­li­ging en het beheer van af­han­ke­lijk­he­den tussen ver­schil­len­de services. Gebruik het commando enable om au­to­ma­ti­sche ac­ti­ve­ring bij het opstarten van het systeem te con­fi­gu­re­ren:

$ sudo systemctl enable application.service
bash

Wanneer dit proces wordt uit­ge­voerd, wordt er een sym­bo­li­sche link aan­ge­maakt. Deze link verbindt de kopie van het sys­teem­ser­vi­ce­be­stand. Het sys­teem­ser­vi­ce­be­stand is meestal te vinden onder /lib/systemd/system of /etc/systemd/system. Hier vindt u ook de map op de harde schijf waar systemd zoekt naar bestanden voor het au­to­ma­tisch opstarten. Dit gebeurt meestal onder /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

Om te voorkomen dat een service au­to­ma­tisch wordt gestart bij het opstarten, gebruikt u disable:

$ sudo systemctl disable application.service
bash

Hierna wordt de sym­bo­li­sche link die au­to­ma­ti­sche ac­ti­ve­ring bij het opstarten spe­ci­fi­ceert, ver­wij­derd.

Let op: het activeren van een service betekent niet dat deze on­mid­del­lijk wordt gestart in de huidige sessie. Om de service on­mid­del­lijk te starten en te con­fi­gu­re­ren zodat deze au­to­ma­tisch wordt gestart bij het opstarten, moet u zowel commando start als commando enable uitvoeren.

Con­tro­leer de status van diensten

Met systemctl kan in­for­ma­tie over de status van services worden weer­ge­ge­ven. Dit is met name handig voor het bewaken en dia­gnos­ti­ce­ren van de huidige status van systeem- en ap­pli­ca­tie­ser­vi­ces. Gebruik het commando status voor de controle:

$ systemctl status application.service
bash

Dit commando geeft allerlei info, zoals de huidige status van de service (actief, inactief, defect, enz.), de meest recente processen en log­be­rich­ten, de cgroup-hi­ë­rar­chie en de eerste logregels.

Om de huidige ac­ti­vi­teits­sta­tus van een service onder Linux te con­tro­le­ren met systemctl, wordt is-active gebruikt. Dit commando geeft aan of een service momenteel actief is of niet:

$ systemctl is-active application.service
bash

De huidige status wordt meestal ge­spe­ci­fi­ceerd als active als de service actief is, of inactive als de service inactief is.

Om te con­tro­le­ren of een service is ge­con­fi­gu­reerd om au­to­ma­tisch te worden in­ge­scha­keld bij het opstarten van het systeem, kunt u het commando is-enabled gebruiken. Dit is met name handig voor het beheren van de start­con­fi­gu­ra­tie van services op een Linux-systeem.

$ systemctl is-enabled application.service
bash

Het commando geeft aan of de service is ge­ac­ti­veerd of ge­de­ac­ti­veerd en stelt op basis van het antwoord de exitcode in op ‘0’ of ‘1’.

U kunt ook het commando is-failed gebruiken om te con­tro­le­ren of een spe­ci­fie­ke service een fout­sta­tus heeft:

$ systemctl is-failed application.service
bash

Als de uit­voe­ring succesvol is, wordt active weer­ge­ge­ven. Als er een fout optreedt, wordt failed weer­ge­ge­ven. Als het apparaat op­zet­te­lijk is gestopt, kan unknown of inactive als reactie worden weer­ge­ge­ven. Een exit­sta­tus van 0 geeft aan dat er een fout is op­ge­tre­den, terwijl 1 elke andere status aangeeft.

Sys­teem­sta­tus

De tot nu toe ge­pre­sen­teer­de commando’s waren gericht op het beheer van in­di­vi­du­e­le services. Deze commando’s geven echter geen inzicht in de huidige sys­teem­sta­tus. Er zijn ver­schil­len­de systemctl-commando’s die precies dit soort in­for­ma­tie kunnen geven.

list-units is handig om een overzicht te krijgen van de huidige eenheden op Linux:

$ systemctl list-units
bash

Wanneer u deze opdracht uitvoert, geeft systemctl een lijst weer van units die door systemd worden beheerd. De uitvoer van deze lijst bevat ver­schil­len­de kolommen met spe­ci­fie­ke in­for­ma­tie over elke unit. De volgende kolommen worden weer­ge­ge­ven:

  • UNIT: De naam van de unit (deze wordt vaak ontleend aan de be­stands­naam van de unit, bij­voor­beeld sshd.service voor de SSH-daemon
  • LOAD: Geeft aan of het unit-bestand succesvol is geladen; mogelijke waarden zijn loaded, not-found of error.
  • ACTIVE: De ac­ti­vi­teits­sta­tus van de unit, die kan wisselen tussen modi zoals active, inactive, activating of deactivating
  • SUB: De on­der­ge­schik­te ac­ti­vi­teits­sta­tus die meer details geeft over de status van de unit (een active kan bij­voor­beeld een SUB-status van running, exited of failed hebben).
  • DE­SCRIP­TI­ON: Een korte be­schrij­ving van de eenheid, die vaak het doel of de func­ti­o­na­li­teit van de eenheid weergeeft.

Het commando toont echter standaard alleen actieve eenheden. Om deze reden toont de kolom LOAD in de uitvoer doorgaans loaded en de kolom ACTIVE active. Met extra vlaggen kan systemctl zo worden ge­con­fi­gu­reerd dat het ook aan­vul­len­de in­for­ma­tie weergeeft. Met de vlag --all worden bij­voor­beeld alle door systemd geladen eenheden weer­ge­ge­ven, ongeacht hun huidige ac­ti­vi­teits­sta­tus.

$ systemctl list-units --all
bash

De uitvoer kan verder worden verfijnd door extra vlaggen te gebruiken, zoals --state= om spe­ci­fie­ke statussen in de ca­te­go­rie­ën LOAD, ACTIVE of SUB te filteren. Het is be­lang­rijk om de vlag --all te behouden, zodat ook inactieve eenheden worden weer­ge­ge­ven:

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

U kunt ook filter --type= gebruiken om bepaalde soorten eenheden weer te geven, bij­voor­beeld als u alleen actieve service-eenheden wilt zien:

$ systemctl list-units --type=service
bash

Alle unit­be­stan­den weergeven

Om een lijst van alle unit-bestanden op Linux weer te geven met systemctl (inclusief die welke systemd niet heeft ge­pro­beerd te laden), kunt u list-unit-files gebruiken. Dit commando geeft alle unit-bestanden weer die systemd kent, inclusief services, sockets, targets en meer.

$ systemctl list-units-files
bash

Het commando geeft ver­schil­len­de statussen van unit-bestanden weer. Deze statussen geven aan hoe de be­tref­fen­de units zijn ge­con­fi­gu­reerd, met name met be­trek­king tot hun gedrag bij het opstarten van het systeem. De meest voor­ko­men­de statussen zijn

  • In­ge­scha­keld: Het apparaat is zo ge­con­fi­gu­reerd dat het au­to­ma­tisch wordt ge­ac­ti­veerd bij het opstarten van het systeem.
  • Uit­ge­scha­keld: Het apparaat is niet ge­con­fi­gu­reerd om au­to­ma­tisch te starten tijdens het opstarten.
  • Ge­mar­keerd: De eenheid is volledig ge­de­ac­ti­veerd, zodat deze niet handmatig of au­to­ma­tisch kan worden gestart.
  • Statisch: Het apparaat wordt niet on­af­han­ke­lijk gestart, maar is doorgaans af­han­ke­lijk van een ander apparaat en wordt alleen in deze context gestart.

Beheer van de eenheid

Een van de be­lang­rijk­ste taken van systemctl is het beheer van units. systemctl biedt een reeks handige commando’s en opties die het ge­mak­ke­lij­ker maken om spe­ci­fie­ke in­for­ma­tie over in­di­vi­du­e­le units te ver­krij­gen en deze te beheren.

Een een­heids­be­stand weergeven

Als u wilt dat de inhoud van een specifiek unit-bestand direct in de console wordt weer­ge­ge­ven, kunt u het commando cat gebruiken. Om bij­voor­beeld het unit-bestand van een service zoals ssh.service te bekijken, voert u het volgende in:

$ systemctl cat ssh.service
bash

Weer­ga­ve­af­han­ke­lijk­he­den

Als u list-dependencies gebruikt, worden de af­han­ke­lijk­he­den van een spe­ci­fie­ke eenheid weer­ge­ge­ven in een boom­struc­tuur. Het commando ziet er als volgt uit:

$ systemctl list-dependencies sshd.service
bash

Het is standaard dat af­han­ke­lijk­he­den worden weer­ge­ge­ven voor .target eenheden die ver­schil­len­de sys­teem­sta­tus­sen ver­te­gen­woor­di­gen. Gebruik de vlag --all voor een volledige, re­cur­sie­ve lijst van alle af­han­ke­lijk­he­den.

Om om­ge­keer­de af­han­ke­lijk­he­den weer te geven (d.w.z. eenheden die af­han­ke­lijk zijn van de opgegeven eenheid), voegt u --reverse toe aan de opdracht. Met de vlaggen --before en —after kunt u ook de af­han­ke­lijk­he­den zien die vóór of na de be­tref­fen­de eenheid beginnen.

Eenheden maskeren en de­mas­ke­ren

Door een unit te maskeren, wordt deze effectief uit­ge­scha­keld, zodat deze niet handmatig of au­to­ma­tisch kan worden gestart. Dit wordt vaak gebruikt om ervoor te zorgen dat een service of unit niet per ongeluk of au­to­ma­tisch wordt gestart door af­han­ke­lijk­he­den. Maskeren gebeurt door een sym­bo­li­sche link van het relevante unit­be­stand naar /dev/null te maken met het commando mask:

$ sudo systemctl mask nginx.service
bash

Dit zorgt ervoor dat de Nginx-service niet handmatig of au­to­ma­tisch kan worden gestart terwijl deze in de ge­mas­keer­de modus staat.

Ont­mas­ke­ren ver­wij­dert de ge­mas­ker­de status van een eenheid, zodat deze weer normaal kan worden gestart. Het commando voor ont­mas­ke­ren is unmask:

$ sudo systemctl unmask nginx.service
bash

Bewerken van unit­be­stan­den

systemctl heeft opties om unit­be­stan­den aan te passen en te wijzigen. Deze functies zijn ge­ïn­tro­du­ceerd in versie 218 van systemd. Als u het commando edit gebruikt, wordt au­to­ma­tisch een unit­be­stand in de ge­se­lec­teer­de unit geopend om te bewerken:

$ sudo systemctl edit nginx.service
bash

Bij het bewerken wordt een leeg bestand aan­ge­maakt om spe­ci­fie­ke in­struc­ties aan een unit­de­fi­ni­tie toe te voegen of te wijzigen. Voor elke unit (bij­voor­beeld nginx.service) wordt een submap aan­ge­maakt in de map /etc/systemd/system, waarbij .d wordt toe­ge­voegd aan de naam van het bestand. In het bo­ven­staan­de voorbeeld zou de submap nginx.service.d zijn.

In deze submap wordt een override.conf-bestand aan­ge­maakt. Wanneer systemd de unit laadt, com­bi­neert het de inhoud van dit frag­ment­be­stand met het oor­spron­ke­lij­ke unit­be­stand. Hier hebben de in­struc­ties van het fragment voorrang. Om het volledige unit­be­stand te verwerken, kan de vlag --full worden gebruikt:

$ sudo systemctl edit --full nginx.service
bash

Door op --full te drukken, wordt het bestaande unit-bestand geopend in een editor om wij­zi­gin­gen aan te brengen. Bij het afsluiten van de editor slaat het systeem het bewerkte bestand op in /etc/systemd/system.

Om wij­zi­gin­gen die u zelf hebt aan­ge­bracht ongedaan te maken, kunt u ofwel de con­fi­gu­ra­tie­map .d van het apparaat ver­wij­de­ren, ofwel het ge­wij­zig­de bestand in /etc/systemd/system:

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

Een volledig herzien unit­be­stand kan met het volgende commando worden ver­wij­derd:

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

Nadat u het bestand of de map hebt ver­wij­derd, moet u systemd opnieuw laden, zodat het niet langer naar de ver­wij­der­de bestanden verwijst, maar terugvalt op de eigen kopie van het systeem:

$ sudo systemctl daemon-reload
bash

Aan­pas­sing van de sys­teem­sta­tus (runlevel) met doelen

systemd gebruikt voor­na­me­lijk target om ver­schil­len­de units te groeperen. Dit wordt gedaan om een spe­ci­fie­ke sys­teem­sta­tus te bereiken, ver­ge­lijk­baar met runlevels in andere init-systemen. De bestanden met de extensie .target fungeren als ori­ën­ta­tie­pun­ten, die de be­schik­baar­heids­sta­tus van bepaalde functies aangeven. Hierdoor kunnen ge­brui­kers de gewenste algemene status spe­ci­fi­ce­ren, in plaats van de af­zon­der­lij­ke units die nodig zijn.

Een praktisch voorbeeld is swap.target, dat de status van swap-ge­reed­heid aangeeft. Eenheden die betrokken zijn bij het swap-proces kunnen zich op deze doel­stel­ling afstemmen met behulp van con­fi­gu­ra­tie­op­ties zoals WantedBy= of RequiredBy=. Eenheden die af­han­ke­lijk zijn van swap kunnen dit daar­en­te­gen aangeven met in­stel­lin­gen zoals Wants=, Requires= en After= om hun af­han­ke­lijk­heid en start­volg­or­de met be­trek­king tot de swap uit te drukken.

Stan­daard­be­stem­ming ophalen en instellen

Door het stan­daard­doel op te halen en in te stellen, kunt u een stan­daard­sta­tus voor uw systeem bij het opstarten de­fi­ni­ë­ren. Zo vindt u het stan­daard­doel voor uw systeem:

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

Als u het stan­daard­doel wilt wijzigen, gebruikt u het commando set-default samen met de naam van het doel. Gebruik het volgende commando om het stan­daard­doel in te stellen op graphical.target, waarmee een grafische ge­brui­kers­in­ter­fa­ce wordt gestart:

$ sudo systemctl set-default graphical.target
bash

Lijst met be­schik­ba­re be­stem­min­gen

Om alle be­stem­min­gen weer te geven die be­schik­baar zijn op uw systeem, kunt u de volgende opdracht gebruiken:

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

Hiermee wordt een lijst weer­ge­ge­ven van alle doel­unit­be­stan­den die op uw systeem zijn ge­ïn­stal­leerd. Voor elk doel worden het pad en de huidige status (bij­voor­beeld ge­ac­ti­veerd of ge­de­ac­ti­veerd) weer­ge­ge­ven.

Doelen isoleren

Met isolate kun je alle eenheden die met een specifiek doel zijn verbonden te­ge­lij­ker­tijd activeren en alle andere eenheden die er niet mee zijn verbonden stoppen.

Stel dat u in een omgeving met de actieve graphical.target werkt en wilt over­scha­ke­len naar een pure multi-user modus zonder grafische ge­brui­kers­in­ter­fa­ce. In dat geval kunt u het grafische systeem de­ac­ti­ve­ren door de multi-user.target te isoleren. Aangezien de graphical.target af­han­ke­lijk is van de multi-user.target, maar niet andersom, worden alle grafische diensten gestopt bij het over­scha­ke­len.

U moet echter eerst de bij­be­ho­ren­de af­han­ke­lijk­he­den con­tro­le­ren voordat u een doel isoleert. Zo voorkomt u dat be­lang­rij­ke processen onbedoeld worden gestopt.

$ systemctl list-dependencies multi-user.target
bash

Als u de actieve eenheden die u wilt behouden hebt aan­ge­vinkt en hiermee akkoord gaat, kunt u de gewenste be­stem­ming isoleren:

$ sudo systemctl isolate multi-user.target
bash

Snel­kop­pe­lin­gen voor be­lang­rij­ke eve­ne­men­ten

Er zijn spe­ci­fie­ke doelen voor es­sen­ti­ë­le be­wer­kin­gen zoals het afsluiten of opnieuw opstarten van het systeem. Onder Linux biedt systemctl echter ook prak­ti­sche snel­kop­pe­lin­gen die extra functies bieden. Om het systeem bij­voor­beeld in de red­dings­mo­dus (single-user mode) te zetten, kunt u gewoon rescue gebruiken in plaats van isolate rescue.target:

$ sudo systemctl rescue
bash

U kunt het systeem stoppen met stop:

$ sudo systemctl stop
bash

Je kunt een volledige uit­scha­ke­ling starten met poweroff:

$ sudo systemctl poweroff
bash

Aan de andere kant kunt u een herstart starten met reboot:

$ sudo systemctl reboot
bash

Als u bent ingelogd, geven deze commando’s u in­for­ma­tie over aan­ko­men­de ge­beur­te­nis­sen. Door het doelwit simpelweg uit te voeren of te isoleren, krijgt u deze in­for­ma­tie niet. Het is be­lang­rijk om te weten dat veel computers de kortere commando’s voor deze acties koppelen aan systemd om een correcte uit­voe­ring te ga­ran­de­ren.

Het volgende commando is normaal gesproken voldoende om het systeem opnieuw op te starten:

$ sudo reboot
bash
Ga naar hoofdmenu