In Linux speelt systemctl een centrale rol in het beheer van het init-systeem en het servicemanagementsysteem systemd. Met systemctl hebben gebruikers controle over systemd-services, de bijbehorende units en configuraties, waardoor het een onmisbaar hulpmiddel is voor systeembeheer. Van opstartcontrole tot het aanpassen van systeemstatussen: systemctl biedt een uitgebreide reeks functies.

Wat is systemctl?

systemctl is een opdrachtregelprogramma voor het beheer van systemd, een init-systeem en systeembeheerder voor Linux-besturingssystemen. systemd is nu het standaard init-systeem voor verschillende Linux-distributies en Linux-serverdistributies, zoals Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia en Gentoo. Het is echter niet in alle distributies geïmplementeerd.

In het systemd-ecosysteem speelt systemctl een centrale rol in het beheer van systeemservices, configuratie, opstartgedrag en systeemonderhoud. De functionaliteit van de tool gaat verder dan alleen het starten en stoppen van services. Het biedt uitgebreid beheer over bijna alle aspecten van een Linux-systeem.

In de volgende tutorial vindt u praktische codevoorbeelden en Linux-commando’s voor het gebruik van systemctl. De onderstaande voorbeelden zijn gebaseerd op Ubuntu 22.04.

Servicemanagement

Het primaire doel van het init-systeem is het starten van de componenten die nodig zijn na het opstarten van de Linux-kernel (userland -componenten). 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 vertegenwoordigen en worden gedefinieerd door unitbestanden. U kunt het type unit herkennen aan de bestandsextensie.

Bij het beheer van services zijn de service-eenheden die eindigen op het achtervoegsel .service belangrijk. Het is echter niet altijd nodig om dit achtervoegsel te gebruiken voor commando’s voor servicebeheer. systemd kan herkennen dat dergelijke commando’s over het algemeen verwijzen naar services.

Services starten en stoppen

Een van de meest voorkomende taken die onder Linux met systemctl worden uitgevoerd, is het starten en stoppen van services. Deze functies zijn van fundamenteel belang voor systeembeheer en stellen u in staat controle te houden over de processen die op een systeem worden uitgevoerd. Gebruik het commando start om een service te starten. Als u werkt als een gebruiker zonder rootrechten, moet u sudo gebruiken.

$ sudo systemctl start application.service
bash

Aangezien systemd is ontworpen om automatisch te zoeken naar .service-bestanden voor servicebeheeropdrachten, kan de opdracht ook in een vereenvoudigde vorm worden ingevoerd:

$ sudo systemctl start application
bash

Om bijvoorbeeld 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 configuratiewijziging, gebruikt u het commando restart:

$ sudo systemctl restart application.service
bash

Als een applicatie zijn configuratiebestanden 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 mogelijkheid biedt om de configuratie opnieuw te laden, kunt u het commando reload-or-restart gebruiken. Hiermee wordt de configuratie opnieuw geladen als deze optie wordt ondersteund. Als dit niet wordt ondersteund, zal het commando de service opnieuw opstarten om de configuratie-update te starten.

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

Diensten activeren en deactiveren

Door services te activeren en deactiveren, kunt u aangeven of een service automatisch moet worden gestart wanneer het systeem opstart. Dit is met name belangrijk voor de systeemprestaties, de beveiliging en het beheer van afhankelijkheden tussen verschillende services. Gebruik het commando enable om automatische activering bij het opstarten van het systeem te configureren:

$ sudo systemctl enable application.service
bash

Wanneer dit proces wordt uitgevoerd, wordt er een symbolische link aangemaakt. Deze link verbindt de kopie van het systeemservicebestand. Het systeemservicebestand 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 automatisch opstarten. Dit gebeurt meestal onder /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

Om te voorkomen dat een service automatisch wordt gestart bij het opstarten, gebruikt u disable:

$ sudo systemctl disable application.service
bash

Hierna wordt de symbolische link die automatische activering bij het opstarten specificeert, verwijderd.

Let op: het activeren van een service betekent niet dat deze onmiddellijk wordt gestart in de huidige sessie. Om de service onmiddellijk te starten en te configureren zodat deze automatisch wordt gestart bij het opstarten, moet u zowel commando start als commando enable uitvoeren.

Controleer de status van diensten

Met systemctl kan informatie over de status van services worden weergegeven. Dit is met name handig voor het bewaken en diagnosticeren van de huidige status van systeem- en applicatieservices. 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 logberichten, de cgroup-hiërarchie en de eerste logregels.

Om de huidige activiteitsstatus van een service onder Linux te controleren 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 gespecificeerd als active als de service actief is, of inactive als de service inactief is.

Om te controleren of een service is geconfigureerd om automatisch te worden ingeschakeld bij het opstarten van het systeem, kunt u het commando is-enabled gebruiken. Dit is met name handig voor het beheren van de startconfiguratie van services op een Linux-systeem.

$ systemctl is-enabled application.service
bash

Het commando geeft aan of de service is geactiveerd of gedeactiveerd en stelt op basis van het antwoord de exitcode in op ‘0’ of ‘1’.

U kunt ook het commando is-failed gebruiken om te controleren of een specifieke service een foutstatus heeft:

$ systemctl is-failed application.service
bash

Als de uitvoering succesvol is, wordt active weergegeven. Als er een fout optreedt, wordt failed weergegeven. Als het apparaat opzettelijk is gestopt, kan unknown of inactive als reactie worden weergegeven. Een exitstatus van 0 geeft aan dat er een fout is opgetreden, terwijl 1 elke andere status aangeeft.

Systeemstatus

De tot nu toe gepresenteerde commando’s waren gericht op het beheer van individuele services. Deze commando’s geven echter geen inzicht in de huidige systeemstatus. Er zijn verschillende systemctl-commando’s die precies dit soort informatie 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 verschillende kolommen met specifieke informatie over elke unit. De volgende kolommen worden weergegeven:

  • UNIT: De naam van de unit (deze wordt vaak ontleend aan de bestandsnaam van de unit, bijvoorbeeld 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 activiteitsstatus van de unit, die kan wisselen tussen modi zoals active, inactive, activating of deactivating
  • SUB: De ondergeschikte activiteitsstatus die meer details geeft over de status van de unit (een active kan bijvoorbeeld een SUB-status van running, exited of failed hebben).
  • DESCRIPTION: Een korte beschrijving van de eenheid, die vaak het doel of de functionaliteit 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 geconfigureerd dat het ook aanvullende informatie weergeeft. Met de vlag --all worden bijvoorbeeld alle door systemd geladen eenheden weergegeven, ongeacht hun huidige activiteitsstatus.

$ systemctl list-units --all
bash

De uitvoer kan verder worden verfijnd door extra vlaggen te gebruiken, zoals --state= om specifieke statussen in de categorieën LOAD, ACTIVE of SUB te filteren. Het is belangrijk om de vlag --all te behouden, zodat ook inactieve eenheden worden weergegeven:

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

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

$ systemctl list-units --type=service
bash

Alle unitbestanden weergeven

Om een lijst van alle unit-bestanden op Linux weer te geven met systemctl (inclusief die welke systemd niet heeft geprobeerd 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 verschillende statussen van unit-bestanden weer. Deze statussen geven aan hoe de betreffende units zijn geconfigureerd, met name met betrekking tot hun gedrag bij het opstarten van het systeem. De meest voorkomende statussen zijn

  • Ingeschakeld: Het apparaat is zo geconfigureerd dat het automatisch wordt geactiveerd bij het opstarten van het systeem.
  • Uitgeschakeld: Het apparaat is niet geconfigureerd om automatisch te starten tijdens het opstarten.
  • Gemarkeerd: De eenheid is volledig gedeactiveerd, zodat deze niet handmatig of automatisch kan worden gestart.
  • Statisch: Het apparaat wordt niet onafhankelijk gestart, maar is doorgaans afhankelijk van een ander apparaat en wordt alleen in deze context gestart.

Beheer van de eenheid

Een van de belangrijkste taken van systemctl is het beheer van units. systemctl biedt een reeks handige commando’s en opties die het gemakkelijker maken om specifieke informatie over individuele units te verkrijgen en deze te beheren.

Een eenheidsbestand weergeven

Als u wilt dat de inhoud van een specifiek unit-bestand direct in de console wordt weergegeven, kunt u het commando cat gebruiken. Om bijvoorbeeld het unit-bestand van een service zoals ssh.service te bekijken, voert u het volgende in:

$ systemctl cat ssh.service
bash

Weergaveafhankelijkheden

Als u list-dependencies gebruikt, worden de afhankelijkheden van een specifieke eenheid weergegeven in een boomstructuur. Het commando ziet er als volgt uit:

$ systemctl list-dependencies sshd.service
bash

Het is standaard dat afhankelijkheden worden weergegeven voor .target eenheden die verschillende systeemstatussen vertegenwoordigen. Gebruik de vlag --all voor een volledige, recursieve lijst van alle afhankelijkheden.

Om omgekeerde afhankelijkheden weer te geven (d.w.z. eenheden die afhankelijk zijn van de opgegeven eenheid), voegt u --reverse toe aan de opdracht. Met de vlaggen --before en —after kunt u ook de afhankelijkheden zien die vóór of na de betreffende eenheid beginnen.

Eenheden maskeren en demaskeren

Door een unit te maskeren, wordt deze effectief uitgeschakeld, zodat deze niet handmatig of automatisch kan worden gestart. Dit wordt vaak gebruikt om ervoor te zorgen dat een service of unit niet per ongeluk of automatisch wordt gestart door afhankelijkheden. Maskeren gebeurt door een symbolische link van het relevante unitbestand 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 automatisch kan worden gestart terwijl deze in de gemaskeerde modus staat.

Ontmaskeren verwijdert de gemaskerde status van een eenheid, zodat deze weer normaal kan worden gestart. Het commando voor ontmaskeren is unmask:

$ sudo systemctl unmask nginx.service
bash

Bewerken van unitbestanden

systemctl heeft opties om unitbestanden aan te passen en te wijzigen. Deze functies zijn geïntroduceerd in versie 218 van systemd. Als u het commando edit gebruikt, wordt automatisch een unitbestand in de geselecteerde unit geopend om te bewerken:

$ sudo systemctl edit nginx.service
bash

Bij het bewerken wordt een leeg bestand aangemaakt om specifieke instructies aan een unitdefinitie toe te voegen of te wijzigen. Voor elke unit (bijvoorbeeld nginx.service) wordt een submap aangemaakt in de map /etc/systemd/system, waarbij .d wordt toegevoegd aan de naam van het bestand. In het bovenstaande voorbeeld zou de submap nginx.service.d zijn.

In deze submap wordt een override.conf-bestand aangemaakt. Wanneer systemd de unit laadt, combineert het de inhoud van dit fragmentbestand met het oorspronkelijke unitbestand. Hier hebben de instructies van het fragment voorrang. Om het volledige unitbestand 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 wijzigingen aan te brengen. Bij het afsluiten van de editor slaat het systeem het bewerkte bestand op in /etc/systemd/system.

Om wijzigingen die u zelf hebt aangebracht ongedaan te maken, kunt u ofwel de configuratiemap .d van het apparaat verwijderen, ofwel het gewijzigde bestand in /etc/systemd/system:

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

Een volledig herzien unitbestand kan met het volgende commando worden verwijderd:

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

Nadat u het bestand of de map hebt verwijderd, moet u systemd opnieuw laden, zodat het niet langer naar de verwijderde bestanden verwijst, maar terugvalt op de eigen kopie van het systeem:

$ sudo systemctl daemon-reload
bash

Aanpassing van de systeemstatus (runlevel) met doelen

systemd gebruikt voornamelijk target om verschillende units te groeperen. Dit wordt gedaan om een specifieke systeemstatus te bereiken, vergelijkbaar met runlevels in andere init-systemen. De bestanden met de extensie .target fungeren als oriëntatiepunten, die de beschikbaarheidsstatus van bepaalde functies aangeven. Hierdoor kunnen gebruikers de gewenste algemene status specificeren, in plaats van de afzonderlijke units die nodig zijn.

Een praktisch voorbeeld is swap.target, dat de status van swap-gereedheid aangeeft. Eenheden die betrokken zijn bij het swap-proces kunnen zich op deze doelstelling afstemmen met behulp van configuratieopties zoals WantedBy= of RequiredBy=. Eenheden die afhankelijk zijn van swap kunnen dit daarentegen aangeven met instellingen zoals Wants=, Requires= en After= om hun afhankelijkheid en startvolgorde met betrekking tot de swap uit te drukken.

Standaardbestemming ophalen en instellen

Door het standaarddoel op te halen en in te stellen, kunt u een standaardstatus voor uw systeem bij het opstarten definiëren. Zo vindt u het standaarddoel voor uw systeem:

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

Als u het standaarddoel wilt wijzigen, gebruikt u het commando set-default samen met de naam van het doel. Gebruik het volgende commando om het standaarddoel in te stellen op graphical.target, waarmee een grafische gebruikersinterface wordt gestart:

$ sudo systemctl set-default graphical.target
bash

Lijst met beschikbare bestemmingen

Om alle bestemmingen weer te geven die beschikbaar zijn op uw systeem, kunt u de volgende opdracht gebruiken:

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

Hiermee wordt een lijst weergegeven van alle doelunitbestanden die op uw systeem zijn geïnstalleerd. Voor elk doel worden het pad en de huidige status (bijvoorbeeld geactiveerd of gedeactiveerd) weergegeven.

Doelen isoleren

Met isolate kun je alle eenheden die met een specifiek doel zijn verbonden tegelijkertijd 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 overschakelen naar een pure multi-user modus zonder grafische gebruikersinterface. In dat geval kunt u het grafische systeem deactiveren door de multi-user.target te isoleren. Aangezien de graphical.target afhankelijk is van de multi-user.target, maar niet andersom, worden alle grafische diensten gestopt bij het overschakelen.

U moet echter eerst de bijbehorende afhankelijkheden controleren voordat u een doel isoleert. Zo voorkomt u dat belangrijke processen onbedoeld worden gestopt.

$ systemctl list-dependencies multi-user.target
bash

Als u de actieve eenheden die u wilt behouden hebt aangevinkt en hiermee akkoord gaat, kunt u de gewenste bestemming isoleren:

$ sudo systemctl isolate multi-user.target
bash

Snelkoppelingen voor belangrijke evenementen

Er zijn specifieke doelen voor essentiële bewerkingen zoals het afsluiten of opnieuw opstarten van het systeem. Onder Linux biedt systemctl echter ook praktische snelkoppelingen die extra functies bieden. Om het systeem bijvoorbeeld in de reddingsmodus (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 uitschakeling 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 informatie over aankomende gebeurtenissen. Door het doelwit simpelweg uit te voeren of te isoleren, krijgt u deze informatie niet. Het is belangrijk om te weten dat veel computers de kortere commando’s voor deze acties koppelen aan systemd om een correcte uitvoering te garanderen.

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

$ sudo reboot
bash
Ga naar hoofdmenu