Ga naar inhoud

systemd-services en timers: Uitgebreide Uitleg en Voorbeelden

Wat is systemd?

  • systemd is de standaard service manager op de meeste moderne Linux-distributies.
  • Het beheert services, sockets, mounts, en kan ook periodieke taken uitvoeren via timers.
  • Het vervangt oudere tools zoals init.d en in veel gevallen ook cron.

Wanneer gebruik je systemd?

  • Voor processen die automatisch moeten starten bij boot.
  • Voor taken die goede logging en monitoring nodig hebben.
  • Voor jobs die afhankelijk zijn van andere services (bijv. netwerk, database).
  • Als alternatief voor cronjobs met betere foutafhandeling.

Basisbegrippen

  • Unit: een configuratiebestand dat iets beschrijft (service, timer, socket, etc).
  • .service bestand: beschrijft wat uitgevoerd moet worden.
  • .timer bestand: beschrijft wanneer iets uitgevoerd moet worden.

Voorbeeld 1: Een eenvoudige service

/etc/systemd/system/hello.service

[Unit]
Description=Hallo wereld service

[Service]
Type=oneshot
ExecStart=/bin/echo "Hallo vanuit systemd!"
  • Type=oneshot: wordt één keer uitgevoerd en stopt daarna.
  • ExecStart: het commando dat uitgevoerd moet worden.

Uitvoeren:

sudo systemctl daemon-reload
sudo systemctl start hello.service

Controleren:

sudo systemctl status hello.service

Logs bekijken:

journalctl -u hello.service -e

Voorbeeld 2: Dagelijkse backup met timer

/etc/systemd/system/backup.service

[Unit]
Description=Dagelijkse backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup

/etc/systemd/system/backup.timer

[Unit]
Description=Backup dagelijks om 03:17

[Timer]
OnCalendar=*-*-* 03:17:00
Persistent=true

[Install]
WantedBy=timers.target
  • OnCalendar: bepaalt het tijdstip.
  • Persistent=true: als de computer uit stond op het geplande tijdstip, wordt de job uitgevoerd zodra de pc weer aan staat.

Activeren:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

Controleren:

systemctl list-timers | grep backup

Voorbeeld 3: Herhalende job (elke 15 minuten)

/etc/systemd/system/cleanup.timer

[Unit]
Description=Opschoonjob elke 15 minuten

[Timer]
OnCalendar=*:0/15
Persistent=true

[Install]
WantedBy=timers.target
  • OnCalendar=*:0/15: elke 15 minuten, elk uur, elke dag.

Voorbeeld 4: Service die altijd blijft draaien

/etc/systemd/system/webapp.service

[Unit]
Description=Mijn webapp

[Service]
ExecStart=/usr/bin/python3 /opt/webapp/app.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
  • Restart=always: als het proces crasht, wordt het opnieuw gestart.
  • RestartSec=5: wacht 5 seconden voor herstart.
  • WantedBy=multi-user.target: start automatisch mee bij boot.

Voorbeeld 5: Afhankelijkheden

Soms wil je dat een service pas start als een andere service draait.

[Unit]
Description=Mijn applicatie
After=network.target mysql.service
Requires=mysql.service

[Service]
ExecStart=/usr/local/bin/mijnapp

[Install]
WantedBy=multi-user.target
  • After=network.target mysql.service: pas starten als netwerk en mysql klaar zijn.
  • Requires=mysql.service: zorgt dat mysql automatisch wordt gestart.

Voorbeeld 6: Omgevingsvariabelen gebruiken

/etc/systemd/system/myapp.service

[Unit]
Description=App met env variabelen

[Service]
Environment="APP_ENV=production"
Environment="DB_HOST=localhost"
ExecStart=/usr/local/bin/myapp

[Install]
WantedBy=multi-user.target
  • Environment: variabelen die je app kan lezen.

Veelgebruikte systemd-commando’s

Command Uitleg
systemctl start dienst.service Start service direct
systemctl stop dienst.service Stop service
systemctl restart dienst.service Herstart service
systemctl status dienst.service Status en logs bekijken
systemctl enable dienst.service Start mee bij boot
systemctl disable dienst.service Niet meer automatisch starten
systemctl list-units --type=service Alle actieve services
systemctl list-timers Alle actieve timers
journalctl -u dienst.service Logs van service
journalctl -u dienst.service -f Live logs volgen

Best practices

  1. Altijd daemon-reload doen na wijzigingen:

    sudo systemctl daemon-reload
    

  2. Gebruik WantedBy=multi-user.target voor services die mee moeten starten bij boot.

  3. Gebruik Restart=always voor applicaties die altijd moeten draaien.

  4. Gebruik timers in plaats van cron als je betere logging wilt en catch-up bij downtime nodig is.

  5. Logs bekijken met journalctl i.p.v. losse logbestanden.