Module 6 · 6.1
Diensten beheren met systemd
Module 6: Diensten en logs · Leestijd: 10 minuten
Leerdoel: Na deze les kun je diensten starten, stoppen, herladen en bij het opstarten laten starten, de status van een dienst lezen, en een instelling van een dienst veilig aanpassen met een drop-in.
Kernbegrippen: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Wie houdt alles draaiende?
Op een server draaien tientallen programma's die er altijd moeten zijn: de SSH-server, de webserver, een database, de tijdsynchronisatie. Zulke programma's heten diensten (services, of daemons). Iemand moet ze bij het opstarten starten, in de gaten houden en opnieuw starten als ze omvallen. Op Debian, Ubuntu, AlmaLinux en Rocky Linux doet systemd dat. Het is het eerste programma dat de kernel start (proces 1), en het start daarna al het andere.
systemd werkt met units: beschrijvingen van iets wat het moet beheren. De belangrijkste soorten:
| Soort | Extensie | Voorbeeld |
|---|---|---|
| Dienst | .service | nginx.service, ssh.service |
| Timer (geplande taak) | .timer | apt-daily.timer (les 4.2, les 6.3) |
| Socket | .socket | ssh.socket op Ubuntu 24.04 en later |
| Doel (groep units) | .target | multi-user.target |
Je praat met systemd via het commando systemctl. De extensie .service mag je weglaten: systemctl status nginx is hetzelfde als systemctl status nginx.service.
De status lezen
Het commando dat je het vaakst gebruikt:
anna@web1:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-11-09 08:12:44 CET; 3h 2min ago
Docs: man:nginx(8)
Process: 902 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 905 (nginx)
Tasks: 3 (limit: 2275)
Memory: 4.1M (peak: 6.3M)
CPU: 213ms
CGroup: /system.slice/nginx.service
├─905 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─906 "nginx: worker process"
nov 09 08:12:44 web1 systemd[1]: Starting nginx.service - A high performance web server...
nov 09 08:12:44 web1 systemd[1]: Started nginx.service - A high performance web server...Lees het van boven naar beneden:
- Het bolletje voor de naam is groen bij een draaiende dienst, wit bij een gestopte en rood bij een mislukte.
- Loaded zegt waar het unit-bestand staat en of de dienst bij het opstarten start (
enabled) of niet (disabled). - Active zegt of hij nu draait (
active (running)), gestopt is (inactive (dead)) of mislukt is (failed), en sinds wanneer. - Main PID en CGroup laten zien welke processen bij de dienst horen.
- Onderaan staan de laatste regels uit het logboek van de dienst. Vaak staat daar al waarom iets misgaat; meer lees je met
journalctl(les 6.2).
Starten, stoppen, herstarten en herladen
anna@web1:~$ sudo systemctl start nginx # nu starten
anna@web1:~$ sudo systemctl stop nginx # nu stoppen
anna@web1:~$ sudo systemctl restart nginx # stoppen en weer starten
anna@web1:~$ sudo systemctl reload nginx # configuratie opnieuw lezen zonder te stoppenHet verschil tussen restart en reload is in de praktijk belangrijk. Bij een restart stopt de dienst even: lopende verbindingen worden verbroken, en als de nieuwe configuratie een fout bevat, start hij niet meer en is je website plat. Bij een reload leest de dienst zijn configuratie opnieuw terwijl hij blijft draaien; bij een fout in de configuratie houdt nginx de oude aan. Gebruik voor nginx, Caddy, SSH en fail2ban na een configuratiewijziging dus reload, en test de configuratie eerst (nginx -t, sshd -t, fail2ban-client -t). Niet elke dienst kent reload; systemctl reload-or-restart kiest zelf.
Bij het opstarten: enable en disable
Starten en "bij het opstarten starten" zijn twee verschillende dingen:
anna@web1:~$ sudo systemctl enable nginx # start voortaan bij het opstarten
anna@web1:~$ sudo systemctl disable nginx # niet meer bij het opstarten
anna@web1:~$ sudo systemctl enable --now nginx # allebei: nu starten én bij het opstarten
anna@web1:~$ systemctl is-enabled nginx
enabledEen klassieke fout: je start een dienst met start, alles werkt, en na de volgende herstart (bijvoorbeeld door een kernelupdate, les 4.2) is hij weg. Gebruik voor een nieuwe dienst daarom enable --now.
Wil je zeker weten dat een dienst nooit start, ook niet als een andere dienst erom vraagt, dan is er mask: sudo systemctl mask <dienst>. Terugdraaien met unmask.
Wat is er mis?
Eén commando laat alle mislukte units zien:
anna@web1:~$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● php8.4-fpm.service loaded failed failed The PHP 8.4 FastCGI Process Manager
1 loaded units listed.Maak hier een gewoonte van, bijvoorbeeld na elke herstart en elke upgrade (les 4.3): de lijst hoort leeg te zijn. Na het oplossen haal je de melding weg met sudo systemctl reset-failed.
Een overzicht van alle draaiende diensten:
anna@web1:~$ systemctl list-units --type=service --state=runningDraait er iets wat je niet kent of niet gebruikt, zoek dan uit wat het is. Elke dienst die niet nodig is, is overbodig aanvalsoppervlak (les 5.1 en 10.1).
Unit-bestanden en drop-ins
Een unit-bestand is een tekstbestand. De versie van het pakket staat in /usr/lib/systemd/system/ (op oudere systemen /lib/systemd/system/). Die pas je nooit aan: een update van het pakket overschrijft hem. Eigen wijzigingen zet je in een drop-in: een klein bestand dat alleen de regels bevat die je wilt veranderen. Dat gaat het makkelijkst met:
anna@web1:~$ sudo systemctl edit nginxEr opent een editor met een leeg stuk tussen twee commentaarregels. Wat je daar schrijft, komt in /etc/systemd/system/nginx.service.d/override.conf. Bijvoorbeeld: nginx automatisch opnieuw starten als hij onverwacht stopt.
[Service]
Restart=on-failure
RestartSec=5sNa het opslaan herlaadt systemctl edit de configuratie van systemd vanzelf. Bewerk je een unit-bestand op een andere manier, doe dan zelf:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload laat systemd de unit-bestanden opnieuw lezen; de dienst zelf moet daarna nog opnieuw starten om de wijziging te gebruiken. Het volledige resultaat (origineel plus drop-ins) zie je met systemctl cat nginx.
Restart=on-failure is een goede gewoonte voor diensten die belangrijk zijn. Maar verstop er geen echte fout mee: een dienst die elke vijf seconden crasht en opnieuw start, hoort in het logboek opgezocht te worden. systemd stopt na een paar snelle mislukkingen achter elkaar met herstarten (de standaardgrens is vijf starts binnen tien seconden) en zet de dienst op failed.
Op AlmaLinux en Rocky Linux
systemd en systemctl werken precies hetzelfde. Alleen de namen van diensten verschillen soms: de SSH-dienst heet sshd, de webserver uit de distributie heet httpd (Apache) of nginx, en de firewall firewalld.
In de praktijk
Het VPS-scherm van je aanbieder (bij WebOké en elders) kan de hele server uitzetten, herstarten of "geforceerd uitzetten". Dat laatste is de stekker eruit: diensten krijgen geen kans om netjes te stoppen en een database kan dan beschadigd raken. Gebruik binnen de server sudo systemctl reboot of sudo shutdown -h now, en in het paneel de gewone knop afsluiten of herstarten.
Samenvatting
- systemd start en bewaakt alle diensten; je bedient het met
systemctl. systemctl statuslaat zien of een dienst draait, of hij bij het opstarten start, en de laatste logregels.start/stop/restartgelden voor nu,enable/disablevoor het opstarten; gebruikenable --nowvoor een nieuwe dienst.- Na een configuratiewijziging: eerst testen, dan
reload;systemctl --failedhoort leeg te zijn. - Pas nooit het unit-bestand van een pakket aan, maar gebruik een drop-in met
systemctl edit.
Quiz
Opdracht
Opdracht O6.1: Je diensten in kaart. Maak op je server een lijst van alle draaiende diensten (systemctl list-units --type=service --state=running) en kijk of systemctl --failed leeg is. Geef van elke dienst aan wat hij doet en of je hem nodig hebt. Zoek van één dienst die je niet kende uit wat hij is (systemctl status, man). Zet daarna voor één belangrijke dienst Restart=on-failure in een drop-in en controleer met systemctl cat dat hij er staat.
Opdracht O6.1: Je diensten in kaart
Deze opdracht doe je zelf; niemand kijkt hem na. Vink af wat je gedaan hebt en markeer de opdracht als gedaan.
Een drop-in staat in /etc/systemd/system/<naam>.service.d/override.conf, niet in /usr/lib/systemd. Bij reload blijft de dienst draaien en houdt bijvoorbeeld nginx bij een fout de oude configuratie; test vooraf met nginx -t of sshd -t. Overbodige diensten: disable --now of het pakket verwijderen.
Je vinkjes en aantekeningen blijven alleen in deze browser; we sturen ze nergens heen. Ben je aangemeld, dan bewaren we in Mijn cursussen alleen dat je de opdracht gedaan hebt.
Verder lezen
- Handleiding
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Handleiding
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Handleiding
systemd.unit(5)(drop-ins): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
