Beetje Coderen

Les 8

Services en logs

Achtergrondservices beheren met systemctl en logs lezen met journalctl.

⏱ 45–60 minuten leestijd + oefenen

🎯 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 enabled of disabled (start hij bij het opstarten?).
  • Active: active (running) is goed. inactive (dead) betekent gestopt; failed betekent 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 failed service 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 werkt enable.

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

  1. Start het lab met systemd: docker run -d --name les8 --privileged registry.wizg.it/webhosting/beetje-labs:les8 en daarna docker exec -it les8 bash.
  2. nginx is geïnstalleerd maar start niet. Zoek met systemctl status en journalctl uit waarom, en schrijf de oorzaak in ~/antwoorden/oorzaak.txt.
  3. Los het probleem op, start nginx en schakel hem in voor het opstarten.
  4. Maak van ~/bin/klok.sh een service klok.service die als gebruiker student draait en bij een crash herstart.
  5. Zet de laatste 10 logregels van klok.service in ~/antwoorden/klok.log.
  6. Controleer met beetje check les8. Ruim daarna op met docker rm -f les8.

Samenvatting

  • systemd start en beheert services; alles wat het beheert, is een unit.
  • systemctl start/stop/restart/reload werkt op nu; enable/disable op het opstarten. enable --now doet beide.
  • systemctl status toont of een service geladen, ingeschakeld en actief is, plus de laatste logregels.
  • journalctl -u naam leest de logs van een service; -f, --since, -p err filteren.
  • Veel programma's schrijven ook logbestanden in /var/log, die logrotate netjes 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

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker. Voor dit lab is er geen live lab in de browser.

Klaar? Controleer je werk met:

$ beetje check les8

📝 Quiz: services en logs

5 vragen · 70% nodig om te slagen

1. Wat is het verschil tussen `systemctl start` en `systemctl enable`?
2. Wat betekent `Active: failed` in systemctl status?
3. Hoe bekijk je de logs van alleen de service nginx?
4. Wat doet `journalctl -u nginx -f`?
5. Wat moet je doen na het aanpassen van een unit-bestand in /etc/systemd/system?

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.

Cursus kopen en verdergaan