Terug naar hoofdinhoud
Linux commando: systemctl
# Topics

Linux commando: systemctl

23 juli 2026

Je installeert een webserver, past de configuratie aan, en wilt hem nu en na elke herstart draaiend hebben. Je moet een dienst stoppen om hem bij te werken, kijken waarom er een is gecrasht, of uitzoeken wat automatisch bij het opstarten start. Op vrijwel elk modern Linux-systeem is het ene commando achter dit alles systemctl. Het is het bedieningspaneel voor systemd, het programma dat je diensten start, je schijven aankoppelt, en het hele systeem in de juiste volgorde opstart. Leer systemctl en je leert hoe een Linux-machine echt draait.

1. De basis

De taak van systemctl is om systemd te bevragen en te besturen, de systeem- en dienstbeheerder. Wanneer je machine opstart, start de kernel een programma, en dat programma is systemd (dat draait als proces-ID 1). Al het andere, van je SSH-server tot je database tot het aankoppelen van schijven, wordt gestart en bewaakt door systemd. systemctl is het gereedschap waarmee je ertegen praat.

Het kernidee is de unit. Systemd denkt niet in termen van "programma's" of "scripts". Het denkt in units: kleine beschrijvingsbestanden die zeggen wat er moet draaien en hoe. De meest voorkomende soort is de service-unit, maar er zijn units voor koppelpunten, timers, sockets en meer. Bijna elk systemctl-commando werkt op een of meer units.

Het juiste mentale model: systemd is de beheerder die alles op de machine draait, en alles wat beheerbaar is (een dienst, een koppeling, een timer) is een unit. systemctl is de afstandsbediening die je op die units richt om ze te starten, stoppen, inspecteren en enablen.

Dit artikel begint met het eenvoudigste gebruik en bouwt stap voor stap op naar het cruciale verschil tussen een dienst starten en enablen, toestand controleren, units veilig bewerken, maskeren, targets, en de verrassende waarheid dat een dienst "enablen" eigenlijk gewoon een symbolische link is. Aan het eind voelt diensten beheren op een systemd-machine als routine.

1.1 Het eenvoudigst mogelijke gebruik

Draai systemctl zonder argumenten en het toont elke unit die systemd op dat moment in het geheugen heeft, in een pager:

$ systemctl
  UNIT                        LOAD   ACTIVE SUB     DESCRIPTION
  bluetooth.service           loaded active running Bluetooth service
  ssh.service                 loaded active running OpenBSD Secure Shell server
  ...

De uitvoer opent in less, dus je kunt scrollen en zoeken met /. Druk op q om te stoppen. De drie toestandskolommen (LOAD, ACTIVE, SUB) vertellen je of systemd de unit correct heeft ingelezen, of hij draait, en de exacte substatus zoals running of exited.

1.2 Een dienst controleren: status

Het commando dat je het vaakst zult draaien is status. Het toont of een unit actief is, of hij bij het opstarten start, zijn hoofdproces, en de laatste paar logregels uit het journal, allemaal in een overzicht:

$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)
     Active: active (running) since Sun 2026-07-12 09:14:02 CEST; 2h ago
   Main PID: 812 (sshd)
      Tasks: 1 (limit: 18789)
     Memory: 5.2M
        CGroup: /system.slice/ssh.service
             └─812 sshd: /usr/sbin/sshd -D [listener]

Twee woorden op die regel zijn het belangrijkst. active (running) vertelt je dat hij nu draait. Het woord enabled op de Loaded:-regel vertelt je dat hij ook automatisch zal starten bij de volgende herstart. Dit zijn twee losse feiten, en het verschil ertussen is het allerbelangrijkste om te begrijpen over systemctl, behandeld in sectie 5.

1.3 Meestal heb je root nodig

Toestand lezen (status, list-units, is-active) werkt als gewone gebruiker. Maar iets veranderen, zoals een systeemdienst starten, stoppen, enablen of disablen, vereist beheerdersrechten. Zet sudo voor die commando's:

$ systemctl status ssh          # reading: no sudo needed
$ sudo systemctl restart ssh    # changing: sudo required

Als je sudo vergeet, laat systemd vaak een polkit-wachtwoordvenster verschijnen in plaats van meteen te falen, maar op een server via SSH weigert het meestal gewoon.

Naar boven

2. Waar komt de naam vandaan?

De naam bestaat uit twee delen die aan elkaar zitten: system plus ctl.

systemctl  =  SYSTEM + con-TROL

Het deel system wijst naar systemd, waarvan de naam zelf "system daemon" betekent (de afsluitende d is de klassieke Unix-conventie voor een achtergronddaemon, zoals in sshd of httpd). Dus systemctl is het gereedschap dat de system daemon bestuurt.

De uitgang ctl is kort voor control, en het is een huisstijl in de hele systemd-familie. Zodra je het patroon ziet, wordt een lange lijst met gereedschapsnamen opeens logisch:

CommandoBestuurt
systemctl diensten en units
journalctl het journal (logs)
hostnamectl de systeemhostnaam
timedatectl tijd, datum en tijdzone
loginctl gebruikersaanmeldingen en sessies
systemd-analyze opstarttijd en prestaties

Dus systemctl lees je als "het besturingsprogramma voor de systeembeheerder". Het is het centrale lid van de familie: de anderen beheren een stukje van het systeem, terwijl systemctl de units beheert die het geheel vormen.

Naar boven

3. Een korte geschiedenis

Om systemctl te begrijpen moet je weten wat het verving, want systemd veranderde hoe Linux opstart meer dan welk ander enkel project ook in de afgelopen twintig jaar.

Voor het grootste deel van de Unix-geschiedenis was het eerste programma dat de kernel startte init, en het traditionele ontwerp was SysV init: een set shell-scripts onder /etc/init.d, in een vaste volgorde gedraaid door genummerde "runlevels". Het werkte, maar het was traag, omdat het diensten na elkaar startte, en kwetsbaar, omdat elke dienst een handgeschreven script was. Je bestuurde een dienst met commando's als service nginx start of door het script direct aan te roepen.

systemd, voor het eerst uitgebracht in 2010 door Lennart Poettering en Kay Sievers, wilde init volledig vervangen. De grote ideeen waren om diensten te beschrijven als kleine declaratieve unit-bestanden in plaats van scripts, om onafhankelijke diensten parallel te starten voor een snellere boot, en om de processen van elke dienst betrouwbaar bij te houden met kernel control groups (cgroups). In de jaren daarna nam vrijwel elke grote distributie het over, en werd systemctl de standaardmanier om diensten te beheren.

TijdperkMijlpaal
Jaren 80 SysV init en genummerde runlevels zetten het patroon voor het opstarten van Unix
2006 Ubuntu levert Upstart, een vroege event-gebaseerde vervanger voor init
2010 systemd wordt uitgebracht, met declaratieve units en parallel opstarten
2014-2015 Debian, Ubuntu, Fedora, RHEL, Arch en SUSE nemen systemd als standaard
Vandaag systemd is de standaard-init op vrijwel alle gangbare Linux-distributies

De overstap ging niet zonder discussie: systemd is groot en doet veel meer dan het oude init, wat sommige beheerders niet aanstaat. Een paar distributies (zoals Devuan) mijden het bewust. Maar op een standaard moderne installatie is systemctl hoe je diensten beheert, en dit artikel is geverifieerd tegen systemd versie 255.

Naar boven

4. Eenvoudige toepassingen

Vier werkwoorden dekken bijna al het dagelijkse dienstwerk: start, stop, restart en reload. Elk neemt een of meer unit-namen. De .service-uitgang is optioneel; als je het type weglaat, gaat systemd uit van .service.

4.1 Een dienst starten en stoppen

start activeert een unit nu; stop deactiveert hem nu. Geen van beide beinvloedt wat er gebeurt bij de volgende herstart.

$ sudo systemctl start nginx      # bring nginx up now
$ sudo systemctl stop nginx       # shut nginx down now

Deze commando's zijn stil bij succes: geen bericht is goed bericht. Draai daarna systemctl status nginx, of controleer de exit-code, om de wijziging te bevestigen.

4.2 Herstarten na een wijziging: restart

Wanneer je het configuratiebestand van een programma wijzigt, stopt restart de dienst en start hem opnieuw zodat de nieuwe instellingen van kracht worden:

$ sudo systemctl restart nginx    # full stop, then start

Een herstart onderbreekt de dienst kort. Voor iets als een webserver betekent dat een kort moment waarop hij niet antwoordt, en daar helpt het volgende commando.

4.3 Herladen zonder de dienst te onderbreken: reload

reload vraagt de draaiende dienst om zijn configuratie opnieuw te lezen zonder te stoppen. Het houdt bestaande verbindingen in leven, zodat een webserver of database niet uitvalt:

$ sudo systemctl reload nginx     # re-read config, stay up

De valkuil: een dienst kan alleen herladen als de maker er ondersteuning voor schreef. Als het niet kan, krijg je een fout. Als je niet zeker weet welke je nodig hebt, herlaadt reload-or-restart als het kan en herstart anders:

$ sudo systemctl reload-or-restart nginx
Naar boven

5. Het belangrijkste onderscheid: start versus enable

Dit is het ene ding dat iedereen in het begin fout doet, dus het krijgt zijn eigen sectie. Een dienst starten en hem enablen zijn twee verschillende acties, en de een doen doet de ander niet.

CommandoEffectOverleeft herstart?
systemctl start X Draait X nu Nee
systemctl enable X Zet X op starten bij boot Ja, maar start hem niet nu

Als je een dienst alleen start, draait hij tot de volgende herstart en komt daarna nooit meer terug. Als je hem alleen enablet, staat hij gepland voor de volgende boot maar draait hij nog niet. Bijna altijd wil je beide, en daarom bestaat de vlag --now:

$ sudo systemctl enable --now nginx    # enable AND start in one step
$ sudo systemctl disable --now nginx   # disable AND stop in one step

5.1 Enable, disable en de --now-snelkoppeling

enable maakt de link die een dienst bij het opstarten laat starten; disable verwijdert hem. Op zichzelf raken ze de huidige draaiende toestand niet aan:

$ sudo systemctl enable nginx      # will start at boot; not running yet
$ sudo systemctl disable nginx     # will not start at boot; still running now

Onthoud de regel: start/stop gaat over nu, enable/disable gaat over boot, en --now overbrugt de twee.

5.2 Ja-of-nee-vragen stellen: is-active, is-enabled, is-failed

Deze drie commando's beantwoorden een enkele vraag en drukken een woord af, wat ze ideaal maakt binnen scripts. Ze zetten ook de exit-code, zodat je ze direct kunt testen:

$ systemctl is-active nginx        # active  / inactive / failed
$ systemctl is-enabled nginx       # enabled / disabled / static / masked
$ systemctl is-failed nginx        # failed  / active

Een woord dat je hier tegenkomt is static: het betekent dat de unit geen install-sectie heeft om te enablen, meestal omdat iets anders hem als afhankelijkheid binnenhaalt. Je kunt een statische unit niet enablen, en dat hoeft ook niet.

5.3 Tonen wat bestaat en wat draait

Twee list-commando's lijken op elkaar maar beantwoorden verschillende vragen. list-units toont units die op dat moment in het geheugen staan (geladen, meestal actief); list-unit-files toont elke unit die op schijf geinstalleerd is en of elk ge-enabled is:

$ systemctl list-units --type=service          # what is loaded now
$ systemctl list-units --type=service --state=running
$ systemctl list-unit-files --type=service     # everything installed, with state
$ systemctl --failed                            # only units that failed

De snelkoppeling --failed (gelijk aan --state=failed) is de snelste gezondheidscontrole op een server: een lege lijst betekent dat er niets kapot is.

Naar boven

6. Gevorderde toepassingen

6.1 Een unit op de juiste manier bewerken: systemctl edit

Bewerk nooit direct het unit-bestand van een leverancier onder /lib/systemd/system; een pakketupdate overschrijft het. Gebruik in plaats daarvan systemctl edit, dat een klein drop-in-overschrijfbestand maakt dat alleen de instellingen wijzigt die je noemt en het origineel met rust laat:

$ sudo systemctl edit nginx        # opens an override drop-in in an editor

Dit schrijft naar /etc/systemd/system/nginx.service.d/override.conf. Jouw regels daar winnen van die van de leverancier. Om het hele bestand te vervangen in plaats van erover te leggen, gebruik je systemctl edit --full. Na het bewerken moet systemd zijn configuratie opnieuw lezen, wat het volgende commando is.

6.2 Systemd zelf herladen: daemon-reload

Er zijn twee heel verschillende soorten "herladen", en ze door elkaar halen is een klassieke valkuil:

  • systemctl reload nginx vertelt de nginx-dienst om zijn eigen config opnieuw te lezen.
  • systemctl daemon-reload vertelt systemd zelf om alle unit-bestanden opnieuw te lezen.

Telkens als je een unit-bestand toevoegt, bewerkt of verwijdert, draai je daemon-reload zodat systemd de wijziging opmerkt, en herstart je daarna de betreffende dienst:

$ sudo systemctl daemon-reload     # systemd re-reads unit files
$ sudo systemctl restart nginx     # apply the new unit definition

Als je een unit bewerkt en je wijzigingen lijken genegeerd, is een gemiste daemon-reload meestal de reden.

6.3 Je eigen service-unit schrijven

Vroeg of laat wil je je eigen programma als beheerde dienst draaien, zodat het bij het opstarten start, herstart bij een fout, en naar het journal logt zoals elke andere unit. Dit doe je door een klein unit-bestand te schrijven onder /etc/systemd/system/. Een service-unit heeft drie secties:

$ sudo nano /etc/systemd/system/myapp.service

[Unit]
Description=My Application
After=network.target

[Service]
ExecStart=/opt/myapp/app.sh
Restart=on-failure
User=myapp

[Install]
WantedBy=multi-user.target

Elke sectie heeft een duidelijke taak:

SectieBeantwoordt
[Unit] Wat is het, en wanneer moet het starten ten opzichte van anderen
[Service] Wat te draaien (ExecStart), als wie, en hoe het te herstarten
[Install] Welke target het binnenhaalt wanneer je het enablet

Na het maken van het bestand vertel je systemd erover en zet je het aan:

$ sudo systemctl daemon-reload      # systemd notices the new file
$ sudo systemctl enable --now myapp  # start it now and at every boot

De regel Restart=on-failure is een van de redenen om een echte unit te verkiezen boven een handmatig gedraaid script: systemd brengt je programma weer omhoog als het crasht.

6.4 Volgorde en vereisten bepalen

De sectie [Unit] is waar je zegt hoe een unit zich tot anderen verhoudt, en twee verschillende ideeen zijn makkelijk te verwarren: volgorde (wanneer) en vereiste (of):

DirectiveBetekenis
After= Alleen volgorde: start deze unit na de genoemde
Before= Alleen volgorde: start deze unit voor de genoemde
Requires= Harde vereiste: als de genoemde unit faalt of stopt, stopt deze ook
Wants= Zachte vereiste: haal de genoemde unit binnen, maar faal niet als hij niet start

De valkuil is dat volgorde en vereiste los staan. Requires= zegt dat de andere unit er moet zijn, maar het zegt niet om erop te wachten; je combineert het bijna altijd met After= om ook de volgorde goed te krijgen:

[Unit]
Requires=postgresql.service
After=postgresql.service

Wants= is de mildere en meer voorkomende keuze: het is wat enable achter de schermen voor je schrijft, en het voorkomt dat een falende afhankelijkheid je dienst met zich meesleurt.

6.5 Afhankelijkheden begrijpen: list-dependencies

Zodra units van elkaar afhangen, moet je vaak de hele boom zien. list-dependencies toont wat een unit binnenhaalt, en met --reverse, wat ervan afhangt:

$ systemctl list-dependencies nginx    # what nginx pulls in
$ systemctl list-dependencies --reverse nginx   # what depends on nginx

Zo beantwoord je "waarom start deze dienst?" en "wat breekt er als ik die stop?".

6.6 Een dienst beveiligen: sandboxing

Een van de meest onderbenutte krachten van systemd is dat de sectie [Service] een dienst in een sandbox kan opsluiten, waardoor kleiner wordt wat een gecompromitteerd programma kan bereiken. Je voegt deze toe als gewone directives, geen container nodig:

DirectiveEffect
ProtectSystem=strict Koppel het hele bestandssysteem alleen-lezen aan voor de dienst
ProtectHome=true Verberg /home en /root voor de dienst
PrivateTmp=true Geef de dienst zijn eigen prive-/tmp
NoNewPrivileges=true Voorkom dat de dienst ooit meer rechten krijgt (geen setuid)
PrivateDevices=true Verberg echte hardware-apparaatknopen

Je kunt meten hoe goed een dienst is dichtgezet met een ingebouwde scanner die elke unit een score geeft en voorstelt wat je toe kunt voegen:

$ systemd-analyze security nginx    # exposure score and per-setting advice

Voor een dienst die aan het internet is blootgesteld, kunnen een paar van deze regels een volledige systeemcompromittering in een ingeperkte veranderen. Voeg ze toe via systemctl edit zodat ze updates overleven.

6.7 Het echte unit-bestand zien: cat en show

systemctl cat drukt het exacte unit-bestand af dat systemd inlaadde, inclusief eventuele drop-ins die erbovenop liggen, zodat je de effectieve definitie ziet:

$ systemctl cat nginx              # the unit file plus any overrides

systemctl show gaat verder en dumpt elke opgeloste eigenschap als KEY=VALUE, wat de manier is om te controleren wat een instelling daadwerkelijk werd:

$ systemctl show nginx -p MemoryCurrent -p ExecStart

6.8 Maskeren: de sterkste uit-schakelaar

disable voorkomt dat een dienst bij het opstarten start, maar iets anders kan hem nog steeds als afhankelijkheid binnenhalen, of je kunt hem nog met de hand starten. mask is het absolute blok: het maakt de unit onmogelijk om te starten, door wie dan ook, totdat je hem unmaskt:

$ sudo systemctl mask nginx        # nginx cannot be started at all now
$ sudo systemctl unmask nginx      # allow it again

Gebruik maskeren wanneer je een dienst echt dood wilt hebben, bijvoorbeeld om de standaardwebserver van een distributie te vervangen door je eigen. Onder de motorkap linkt maskeren de unit aan /dev/null, wat sectie 7 uitlegt.

6.9 Targets: units groeperen in systeemtoestanden

Een target is een speciale unit die andere units groepeert, gebruikt om een hele systeemtoestand te beschrijven. Targets zijn de vervanging van systemd voor de oude runlevels:

TargetGrofweg oud runlevelBetekenis
multi-user.target 3 Volledig systeem, netwerk, geen grafische aanmelding
graphical.target 5 Alles in multi-user, plus een desktop
rescue.target 1 Single-user reddingsshell, minimale diensten
emergency.target - Kaalste shell, bijna niets gestart

Je kunt de boot-standaard bekijken, wijzigen, of het draaiende systeem in een andere target schakelen:

$ systemctl get-default                       # e.g. graphical.target
$ sudo systemctl set-default multi-user.target  # boot without a desktop next time
$ sudo systemctl isolate rescue.target          # switch to rescue mode now

6.10 Herstarten, uitschakelen en slaapstand

Omdat systemd de hele systeemtoestand beheert, bezit het ook het afsluiten en slapen. Deze werkwoorden vervangen de oudere losse commando's:

$ systemctl reboot         # restart the machine
$ systemctl poweroff       # shut down and power off
$ systemctl suspend        # sleep to RAM
$ systemctl hibernate      # sleep to disk
Naar boven

7. Iets wat de meeste gebruikers niet weten

Het woord enable klinkt alsof het een schakelaar diep in systemd omzet. Het doet iets veel eenvoudigers: het maakt een symbolische link. Een unit-bestand heeft een [Install]-sectie die zegt welke target het wil, bijvoorbeeld WantedBy=multi-user.target. Wanneer je de unit enablet, maakt systemd er een symlink naar binnen de .wants-map van die target:

$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service
               → /lib/systemd/system/nginx.service.

Bij het opstarten start systemd multi-user.target, ziet de symlinks in zijn .wants-map, en start elke gelinkte unit. Dat is het hele mechanisme. disable verwijdert simpelweg de link. Zodra je dit weet, houdt het hele enable/disable-systeem op magie te zijn en wordt het bestanden die je met ls kunt tonen.

Enablen is geen verborgen databasevlag. Het is een symlink in de .wants-map van een target. Booten is systemd die die links volgt. Alles wat je kunt enablen, zou je met de hand kunnen maken met ln -s (al zou je dat niet moeten doen; laat systemctl het doen).

Maskeren gebruikt dezelfde truc omgekeerd. Wanneer je een unit maskeert, linkt systemd zijn naam aan /dev/null:

$ sudo systemctl mask nginx
Created symlink /etc/systemd/system/nginx.service → /dev/null.

Omdat de unit nu "is" het lege apparaat, ziet systemd niets om te draaien en weigert het elke poging om hem te starten, of dat nu door jou is, bij het opstarten, of als afhankelijkheid. Daarom is maskeren sterker dan disablen: een gedisablede unit bestaat nog en kan worden gestart; een gemaskerde wijst naar niets.

7.3 systemctl raakt diensten niet direct aan: het spreekt D-Bus

Wanneer je systemctl restart nginx draait, start of stopt het programma systemctl zelf niets. Het stuurt een bericht naar systemd (het proces met PID 1) over D-Bus, de standaard berichtenbus die Linux gebruikt om programma's met elkaar te laten praten. Systemd ontvangt het verzoek, controleert of je het mag doen, doet het echte werk, werkt de toestand van de unit bij, en schrijft het resultaat naar het journal.

Dit ontwerp verklaart verschillende dingen die je misschien hebt gemerkt:

  • Een polkit-wachtwoordvenster kan op een desktop verschijnen, omdat D-Bus systemd laat vragen aan een autorisatiedienst of de actie is toegestaan.
  • Je kunt een machine op protocolniveau op afstand beheren met systemctl -H user@host, omdat het verzoek gewoon een bericht is dat kan reizen.
  • systemctl is eigenlijk een dunne client: de intelligentie zit in de systemd-beheerder waarmee het praat, niet in het commando.

7.4 Dezelfde unit kan op drie plekken staan

Systemd zoekt unit-bestanden in verschillende mappen, en wanneer dezelfde unit-naam in meer dan een verschijnt, beslist een vaste volgorde van voorrang welke wint. Van hoogste prioriteit naar laagste:

MapDoelPrioriteit
/etc/systemd/system/ Jouw lokale wijzigingen en eigen units Hoogste (beheerder wint)
/run/systemd/system/ Runtime-units, weg na herstart Midden
/usr/lib/systemd/system/ Leveranciers- en pakketunits Laagste

Deze rangorde is de hele reden dat drop-ins en systemctl edit werken: jouw bestand in /etc verslaat altijd het bestand van het pakket in /usr/lib, zodat een update van het pakket je wijziging niet stilletjes ongedaan kan maken. Op Debian en Ubuntu is /lib/systemd/system dezelfde locatie als /usr/lib/systemd/system. Om te zien welk bestand daadwerkelijk won, gebruik je systemctl cat.

7.5 Je hebt je eigen persoonlijke systemd

Systemd draait een tweede, aparte instantie enkel voor jouw aanmelding: de user manager. Het beheert diensten die van jou zijn en geen root nodig hebben, zoals een desktopcomponent of een persoonlijke back-uptimer. Je bestuurt het door --user aan elk commando toe te voegen:

$ systemctl --user status               # your own units
$ systemctl --user start myapp          # a service you own, no sudo
$ systemctl --user enable --now myapp

Gebruikersunits staan onder ~/.config/systemd/user/. Dit verklaart een veelvoorkomende verwarring: een dienst die je met systemctl --user startte, verschijnt niet onder een gewone systemctl status, omdat die de systeembeheerder bevraagt, niet die van jou. Als je wilt dat een gebruikersdienst blijft draaien nadat je bent afgemeld, enable dan lingering voor je account met loginctl enable-linger.

7.6 Alles wat beheerbaar is, is een unit, niet alleen diensten

Omdat mensen systemctl vooral voor diensten gebruiken, is het makkelijk te vergeten dat systemd veel andere unit-typen op dezelfde manier beheert. De uitgang vertelt je het type:

UitgangUnit-typeBeheert
.service Service Een daemon of programma
.socket Socket Een poort of socket die een dienst start bij eerste gebruik
.timer Timer Een geplande taak, een moderne vervanging voor cron
.mount Mount Een koppelpunt van een bestandssysteem
.target Target Een groep units en een systeemtoestand

Dus systemctl list-timers toont je geplande taken, en systemctl start something.mount koppelt een bestandssysteem aan. Dezelfde werkwoorden start, stop, enable en status werken op allemaal.

7.7 Waar systemctl stopt, nemen andere gereedschappen het over

systemctl bestuurt units; een paar buren pikken op waar het eindigt:

  • journalctl -u nginx leest de logs van een unit; systemctl status toont slechts de laatste paar regels.
  • systemd-analyze blame toont welke units je boot het meest vertraagden, en systemd-analyze critical-chain toont de geordende keten die hem gated.
  • systemctl list-timers toont geplande timers; bewerk ze als .timer-units.
  • loginctl beheert gebruikerssessies en lingering; hostnamectl en timedatectl regelen de hostnaam en klok.

Deze grens kennen houdt je efficient: systemctl om een dienst te besturen, journalctl om te lezen waarom hij faalde.

Naar boven

8. Beste praktijken

  • Beslis bewust over "nu" en "bij boot". Voor een dienst die je permanent wilt, gebruik enable --now. Voor een eenmalige, gebruik gewoon start. Duidelijk zijn over welke je bedoelt, voorkomt verrassingen na een herstart.
  • Verkies reload boven restart wanneer het bestaat. Een reload houdt verbindingen in leven; een restart onderbreekt ze even. Val terug op reload-or-restart als je twijfelt.
  • Bewerk nooit direct leveranciers-unit-bestanden. Gebruik systemctl edit om een drop-in-overschrijving toe te voegen, zodat een pakketupdate je wijzigingen niet kan wissen.
  • Draai daemon-reload na elke unit-bestandswijziging. Anders blijft systemd de oude definitie gebruiken en lijken je bewerkingen niets te doen.
  • Geef je eigen programma een echte unit. Een kort [Unit]/[Service]/[Install]-bestand met Restart=on-failure verslaat een handmatig gedraaid script: het start bij boot, herstart bij een crash, en logt naar het journal.
  • Sandbox diensten die aan het internet hangen. Voeg een paar regels toe zoals ProtectSystem=strict, PrivateTmp=true en NoNewPrivileges=true, en controleer het resultaat met systemd-analyze security.
  • Controleer systemctl --failed regelmatig. Op een server is het de snelste manier om een dienst te vinden die stilletjes stierf.
  • Gebruik systemctl cat om de waarheid te zien. Het toont de echte, effectieve unit inclusief overschrijvingen, wat gissen voorkomt over welk bestand van kracht is.
  • Lees de handleiding als je twijfelt. Het gedrag is volledig gedocumenteerd; man systemctl en man systemd.unit zijn de naslag.
$ man systemctl         # the command and all its verbs
$ man systemd.service    # how to write a service unit
$ systemctl --help       # a quick summary of the commands
Naar boven

9. Veelgemaakte fouten

9.1 Mythe versus werkelijkheid

MytheWerkelijkheid
"systemctl start maakt een dienst permanent." Het draait de dienst alleen nu. Gebruik enable (of enable --now) om hem bij boot te laten starten.
"enable start de dienst ook." Op zichzelf plant het hem alleen voor de volgende boot. Voeg --now toe om hem ook te starten.
"reload en daemon-reload zijn hetzelfde." reload herleest de eigen config van de dienst; daemon-reload herleest systemds unit-bestanden. Ze lossen verschillende problemen op.
"disable garandeert dat een dienst nooit kan draaien." Een gedisablede unit kan nog met de hand worden gestart of als afhankelijkheid worden binnengehaald. Gebruik mask voor een absoluut blok.
"Het bestand in /lib/systemd/system bewerken is prima." Een pakketupdate overschrijft het. Gebruik systemctl edit om wijzigingen in een veilige drop-in te houden.

9.2 Andere valkuilen om te vermijden

  • daemon-reload vergeten na het bewerken van een unit. Systemd cachet unit-bestanden in het geheugen. Tot je herlaadt, gebruikt het de oude versie en lijkt je bewerking genegeerd.
  • Herstarten terwijl een reload zou volstaan. Op een drukke web- of databaseserver onderbreekt een onnodige restart live verbindingen. Controleer eerst of reload wordt ondersteund.
  • Een gebruikersdienst in de systeemweergave zoeken. Een unit gestart met --user verschijnt niet onder een gewone systemctl status. Voeg --user toe om hem te zien.
  • Logs lezen met het verkeerde gereedschap. systemctl status toont slechts de laatste regels. Voor de volledige geschiedenis van een unit stap je over op journalctl -u name.
  • De dienstnaam verwarren met de programmanaam. De unit kan ssh.service zijn terwijl het proces sshd is. Gebruik systemctl list-units of tab-aanvulling om de exacte unit-naam te vinden.
Naar boven

10. Samenvatting

Het commando systemctl is het bedieningspaneel voor systemd, en systemd draait alles op een moderne Linux-machine. Leer een handvol werkwoorden en een belangrijk onderscheid, en diensten beheren wordt kalm en voorspelbaar in plaats van giswerk.

  • systemctl bevraagt en bestuurt systemd, de beheerder die elke dienst, koppeling en timer als een unit start.
  • De naam betekent "system control", onderdeel van de systemd-familie naast journalctl en timedatectl.
  • Het verving SysV-init-scripts door declaratieve unit-bestanden en parallel opstarten, en arriveerde met systemd in 2010.
  • Beheer een draaiende dienst met start, stop, restart en reload; controleer hem met status.
  • Het cruciale onderscheid: start/stop werken nu, enable/disable werken bij boot, en --now doet beide.
  • Stel ja-of-nee met is-active, is-enabled en is-failed; toon toestand met list-units, list-unit-files en --failed.
  • Schrijf je eigen dienst als een klein [Unit]/[Service]/[Install]-bestand, orden het met After=/Before=, en vereis anderen met Wants=/Requires=.
  • Beveilig een dienst in zijn [Service]-sectie met sandboxing (ProtectSystem=, PrivateTmp=, NoNewPrivileges=), gescoord door systemd-analyze security.
  • Bewerk units veilig met systemctl edit (een drop-in), draai daarna daemon-reload zodat systemd het opmerkt.
  • Blokkeer een dienst volledig met mask; groepeer units en systeemtoestanden met targets zoals multi-user.target.
  • Onder de motorkap is enablen een symlink in de .wants-map van een target, is maskeren een symlink naar /dev/null, en bereikt systemctl systemd via D-Bus.
  • Een unit in /etc/systemd/system overschrijft altijd de leverancierskopie in /usr/lib/systemd/system, wat drop-ins updates laat overleven.
  • Je hebt een tweede, persoonlijke systemd bereikbaar met --user, en alles wat beheerbaar is (dienst, timer, koppeling, target) is een unit.

Dit is de handige naslag om te bewaren:

systemctl status nginx           is it running, enabled, and healthy
systemctl start nginx            run it now
systemctl stop nginx             shut it down now
systemctl restart nginx          full stop then start
systemctl reload nginx           re-read config, stay up
systemctl enable nginx           start at boot (not now)
systemctl enable --now nginx     start at boot AND now
systemctl disable --now nginx    stop now AND at boot
systemctl is-active nginx        one-word running check
systemctl is-enabled nginx       one-word boot check
systemctl --failed               list everything that failed
systemctl list-units --type=service   loaded services
systemctl list-unit-files        every installed unit and its state
systemctl edit nginx             safe drop-in override
systemctl daemon-reload          reload unit files after editing
systemctl cat nginx              show the effective unit file
systemctl mask nginx             block a service completely
systemctl list-dependencies nginx     what it needs
systemd-analyze security nginx   score a service's sandboxing
systemctl --user status          your own user services
systemctl reboot                 restart the machine

Diensten goed beheren is een van de stille vaardigheden die een kalme serverbeheerder onderscheiden van een gestreste: het verschil tussen een site die na elke herstart netjes terugkomt en een die stilletjes vergeet een dienst te starten op het slechtst denkbare moment. Als je servers diensten hebben die een herstart niet overleven, wijzigingen die nooit van kracht lijken te worden, of een boot die niemand echt begrijpt, loont het om systemd goed in te richten voor het volgende incident, zodat de machine zich precies gedraagt zoals je verwacht.

Naar boven
Linux commando: systemctl
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.