Les 8
Services en logs
Achtergrondservices beheren met systemctl en logs lezen met journalctl.
🎯 Na deze les kun je
- services starten, stoppen en inschakelen
- de status van een service lezen
- logs filteren met journalctl
Een webserver moet blijven draaien, ook als niemand is ingelogd. Na een herstart moet hij vanzelf weer opstarten, en als hij crasht wil je dat hij opnieuw start en dat je kunt teruglezen wat er misging. Programma's die zo op de achtergrond draaien, heten services (of daemons). Op vrijwel alle moderne Linux-distributies worden ze beheerd door systemd. In deze les leer je services starten, stoppen en inschakelen, hun status lezen, en de logs doorzoeken.
Systemd en units
systemd is het eerste proces dat de kernel start (PID 1, les 6). Het start alle andere services, in de juiste volgorde. Alles wat systemd beheert, heet een unit. Er zijn verschillende soorten, te herkennen aan de extensie:
| Soort | Voorbeeld | Wat |
|---|---|---|
.service |
nginx.service |
een dienst (een programma dat blijft draaien) |
.timer |
apt-daily.timer |
een geplande taak, alternatief voor cron (les 12) |
.socket |
ssh.socket |
start een dienst zodra er een verbinding binnenkomt |
.target |
multi-user.target |
een groep units, zoals "systeem volledig opgestart" |
Unit-bestanden van pakketten staan in /usr/lib/systemd/system/. Eigen units en aanpassingen zet je in /etc/systemd/system/.
systemctl: services beheren
| Commando | Doet |
|---|---|
systemctl status nginx |
status bekijken (geen sudo nodig) |
sudo systemctl start nginx |
nu starten |
sudo systemctl stop nginx |
nu stoppen |
sudo systemctl restart nginx |
stoppen en starten |
sudo systemctl reload nginx |
configuratie opnieuw inlezen zonder te stoppen |
sudo systemctl enable nginx |
automatisch starten bij het opstarten |
sudo systemctl disable nginx |
niet meer automatisch starten |
sudo systemctl enable --now nginx |
inschakelen én meteen starten |
systemctl list-units --type=service |
alle actieve services |
systemctl --failed |
units die mislukt zijn |
Let op het verschil tussen start en enable. start gaat over nu; enable over de volgende keer dat het systeem opstart. Een klassieke fout is een service alleen starten: na de eerstvolgende herstart is je website plat.
reload is vriendelijker dan restart: lopende verbindingen worden niet afgebroken. Niet elke service ondersteunt het; nginx wel. Test altijd eerst je configuratie (les 5): sudo nginx -t && sudo systemctl reload nginx. Door && gebeurt de reload alleen als de test slaagt.
De status lezen
$ 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-10-12 09:12:44 CEST; 1h 18min ago
Docs: man:nginx(8)
Main PID: 802 (nginx)
Tasks: 3 (limit: 4645)
Memory: 4.1M
CGroup: /system.slice/nginx.service
├─802 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─803 "nginx: worker process"
└─804 "nginx: worker process"
Oct 12 09:12:44 web01 systemd[1]: Starting nginx.service - A high performance web server...
Oct 12 09:12:44 web01 systemd[1]: Started nginx.service - A high performance web server...
Lees vooral:
- Loaded: waar het unit-bestand staat, en
enabledofdisabled(start hij bij het opstarten?). - Active:
active (running)is goed.inactive (dead)betekent gestopt;failedbetekent dat hij crashte of niet kon starten. - Main PID en de procesboom: de processen van deze service (les 6).
- Onderaan: de laatste logregels. Bij een
failedservice staat hier vaak al de oorzaak.
Logs met journalctl
Systemd verzamelt de uitvoer van alle services in het journal. Je leest het met journalctl:
| Commando | Toont |
|---|---|
journalctl -u nginx |
alle logregels van één unit |
journalctl -u nginx -f |
live volgen (zoals tail -f, les 3) |
journalctl -u nginx --since "1 hour ago" |
alleen het laatste uur |
journalctl -u nginx --since today -p err |
alleen fouten van vandaag |
journalctl -b |
alles sinds de laatste keer opstarten |
journalctl -e |
naar het eind springen |
journalctl -n 50 --no-pager |
de laatste 50 regels, zonder bladeren |
-p filtert op prioriteit: err toont fouten en erger (crit, alert, emerg); warning ook waarschuwingen. Je kunt ook gewoon pipen: journalctl -u nginx | grep -i error.
Een werkwijze bij een service die niet start:
sudo systemctl start nginx
systemctl status nginx # failed?
journalctl -u nginx -n 30 --no-pager # wat zegt de dienst zelf?
Oct 12 10:41:07 web01 nginx[1932]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Oct 12 10:41:07 web01 systemd[1]: nginx.service: Failed with result 'exit-code'.
Address already in use: er draait al iets anders op poort 80. In les 9 leer je met ss uitzoeken wat.
Logbestanden in /var/log
Niet alles gaat via het journal. Veel programma's schrijven ook (of alleen) eigen logbestanden in /var/log:
| Bestand / map | Inhoud |
|---|---|
/var/log/nginx/access.log |
elk verzoek aan de webserver (les 3) |
/var/log/nginx/error.log |
fouten van nginx |
/var/log/auth.log |
inlogpogingen, sudo-gebruik (op Debian/Ubuntu, als rsyslog geïnstalleerd is) |
/var/log/apt/ |
wat apt geïnstalleerd en bijgewerkt heeft (les 7) |
/var/log/syslog |
algemene systeemmeldingen (als rsyslog geïnstalleerd is) |
Logbestanden groeien. Het programma logrotate hernoemt ze periodiek (access.log.1, access.log.2.gz) en gooit oude weg. Daarom zie je die genummerde bestanden in /var/log. Oudere gecomprimeerde logs lees je met zcat of zgrep.
Een eigen service
Je kunt van elk programma een service maken met een klein unit-bestand, bijvoorbeeld /etc/systemd/system/weerlogger.service:
[Unit]
Description=Weerlogger die elk kwartier het weer opslaat
After=network-online.target
[Service]
ExecStart=/usr/bin/python3 /opt/weerlogger/weer.py
User=weer
Restart=on-failure
[Install]
WantedBy=multi-user.target
ExecStart: het commando, altijd met een absoluut pad.User: draai niet als root als het niet nodig is (les 4).Restart=on-failure: bij een crash start systemd hem opnieuw.WantedBy=multi-user.target: hierdoor werktenable.
Na het maken of aanpassen van een unit-bestand: sudo systemctl daemon-reload, en dan enable --now.
Oefenen
Oefening 1. Na een herstart van de server is je website onbereikbaar. systemctl status nginx toont Loaded: ... disabled en Active: inactive (dead). Wat is er aan de hand en hoe los je het op?
Modelantwoord oefening 1
nginx is ooit wel gestart, maar niet ingeschakeld voor het opstarten. Oplossing: sudo systemctl enable --now nginx.
Oefening 2. Toon alle foutmeldingen van de service ssh van het afgelopen uur.
Modelantwoord oefening 2
journalctl -u ssh --since "1 hour ago" -p err
Oefening 3. Je hebt de nginx-configuratie aangepast. Schrijf één regel die de configuratie test en alleen bij succes nginx herlaadt.
Modelantwoord oefening 3
sudo nginx -t && sudo systemctl reload nginx
&& voert het tweede commando alleen uit als het eerste gelukt is (exitcode 0; meer daarover in les 11).
Lab: een webserver als service
- Start het lab met systemd:
docker run -d --name les8 --privileged registry.wizg.it/webhosting/beetje-labs:les8en daarnadocker exec -it les8 bash. - nginx is geïnstalleerd maar start niet. Zoek met
systemctl statusenjournalctluit waarom, en schrijf de oorzaak in~/antwoorden/oorzaak.txt. - Los het probleem op, start nginx en schakel hem in voor het opstarten.
- Maak van
~/bin/klok.sheen serviceklok.servicedie als gebruikerstudentdraait en bij een crash herstart. - Zet de laatste 10 logregels van
klok.servicein~/antwoorden/klok.log. - Controleer met
beetje check les8. Ruim daarna op metdocker rm -f les8.
Samenvatting
- systemd start en beheert services; alles wat het beheert, is een unit.
systemctl start/stop/restart/reloadwerkt op nu;enable/disableop het opstarten.enable --nowdoet beide.systemctl statustoont of een service geladen, ingeschakeld en actief is, plus de laatste logregels.journalctl -u naamleest de logs van een service;-f,--since,-p errfilteren.- Veel programma's schrijven ook logbestanden in
/var/log, dielogrotatenetjes houdt.
In les 9 ga je het netwerk op: IP-adressen, verbindingen testen en uitzoeken waarom een website onbereikbaar is.
Lab
Een webserver als service beheren
💻 Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):
$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:les8
Klaar? Controleer je werk met:
$ beetje check les8
📝 Quiz: services en logs
Dit was de laatste gratis les
Je hebt les 1–8 van Een beetje Linux & Docker gratis gevolgd. Wil je verder? Met één aankoop (€ 19,00, eenmalig) krijg je de overige 20 lessen, de live labs en het certificaat. Geen abonnement.