Linux commando: systemctl
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.
systemctlis 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.
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:
| Commando | Bestuurt |
|---|---|
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.
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.
| Tijdperk | Mijlpaal |
|---|---|
| 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.
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 boven5. 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.
| Commando | Effect | Overleeft 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.
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 nginxvertelt de nginx-dienst om zijn eigen config opnieuw te lezen.systemctl daemon-reloadvertelt 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:
| Sectie | Beantwoordt |
|---|---|
[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):
| Directive | Betekenis |
|---|---|
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:
| Directive | Effect |
|---|---|
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:
| Target | Grofweg oud runlevel | Betekenis |
|---|---|---|
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 boven7. Iets wat de meeste gebruikers niet weten
7.1 "Enablen" is gewoon een symbolische link
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 metln -s(al zou je dat niet moeten doen; laatsystemctlhet doen).
7.2 Maskeren is een link naar het niets
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. systemctlis 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:
| Map | Doel | Prioriteit |
|---|---|---|
/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:
| Uitgang | Unit-type | Beheert |
|---|---|---|
.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 nginxleest de logs van een unit;systemctl statustoont slechts de laatste paar regels.systemd-analyze blametoont welke units je boot het meest vertraagden, ensystemd-analyze critical-chaintoont de geordende keten die hem gated.systemctl list-timerstoont geplande timers; bewerk ze als.timer-units.loginctlbeheert gebruikerssessies en lingering;hostnamectlentimedatectlregelen de hostnaam en klok.
Deze grens kennen houdt je efficient: systemctl om een dienst te besturen, journalctl om te lezen waarom hij faalde.
8. Beste praktijken
- Beslis bewust over "nu" en "bij boot". Voor een dienst die je permanent wilt, gebruik
enable --now. Voor een eenmalige, gebruik gewoonstart. Duidelijk zijn over welke je bedoelt, voorkomt verrassingen na een herstart. - Verkies
reloadbovenrestartwanneer het bestaat. Een reload houdt verbindingen in leven; een restart onderbreekt ze even. Val terug opreload-or-restartals je twijfelt. - Bewerk nooit direct leveranciers-unit-bestanden. Gebruik
systemctl editom een drop-in-overschrijving toe te voegen, zodat een pakketupdate je wijzigingen niet kan wissen. - Draai
daemon-reloadna 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 metRestart=on-failureverslaat 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=trueenNoNewPrivileges=true, en controleer het resultaat metsystemd-analyze security. - Controleer
systemctl --failedregelmatig. Op een server is het de snelste manier om een dienst te vinden die stilletjes stierf. - Gebruik
systemctl catom 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 systemctlenman systemd.unitzijn 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 boven9. Veelgemaakte fouten
9.1 Mythe versus werkelijkheid
| Mythe | Werkelijkheid |
|---|---|
"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-reloadvergeten 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
restartlive verbindingen. Controleer eerst ofreloadwordt ondersteund. - Een gebruikersdienst in de systeemweergave zoeken. Een unit gestart met
--userverschijnt niet onder een gewonesystemctl status. Voeg--usertoe om hem te zien. - Logs lezen met het verkeerde gereedschap.
systemctl statustoont slechts de laatste regels. Voor de volledige geschiedenis van een unit stap je over opjournalctl -u name. - De dienstnaam verwarren met de programmanaam. De unit kan
ssh.servicezijn terwijl het processshdis. Gebruiksystemctl list-unitsof tab-aanvulling om de exacte unit-naam te vinden.
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.
systemctlbevraagt 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
journalctlentimedatectl. - 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,restartenreload; controleer hem metstatus. - Het cruciale onderscheid:
start/stopwerken nu,enable/disablewerken bij boot, en--nowdoet beide. - Stel ja-of-nee met
is-active,is-enabledenis-failed; toon toestand metlist-units,list-unit-filesen--failed. - Schrijf je eigen dienst als een klein
[Unit]/[Service]/[Install]-bestand, orden het metAfter=/Before=, en vereis anderen metWants=/Requires=. - Beveilig een dienst in zijn
[Service]-sectie met sandboxing (ProtectSystem=,PrivateTmp=,NoNewPrivileges=), gescoord doorsystemd-analyze security. - Bewerk units veilig met
systemctl edit(een drop-in), draai daarnadaemon-reloadzodat systemd het opmerkt. - Blokkeer een dienst volledig met
mask; groepeer units en systeemtoestanden met targets zoalsmulti-user.target. - Onder de motorkap is enablen een symlink in de
.wants-map van een target, is maskeren een symlink naar/dev/null, en bereiktsystemctlsystemd via D-Bus. - Een unit in
/etc/systemd/systemoverschrijft 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

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


