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:
Controleren:
Logs bekijken:
Voorbeeld 2: Dagelijkse backup met timer¶
/etc/systemd/system/backup.service
/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:
Controleren:
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¶
-
Altijd
daemon-reloaddoen na wijzigingen:
-
Gebruik
WantedBy=multi-user.targetvoor services die mee moeten starten bij boot. -
Gebruik
Restart=alwaysvoor applicaties die altijd moeten draaien. -
Gebruik timers in plaats van cron als je betere logging wilt en catch-up bij downtime nodig is.
-
Logs bekijken met
journalctli.p.v. losse logbestanden.