systemd-services beheren en unitbestanden schrijven
Beheer services met systemctl en schrijf aangepaste unit- en timerbestanden voor scripted daemons.
systemd-services beheren en unitbestanden schrijven is een gratis DevOps-bootcamp-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject DevOps-bootcamp. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus DevOps-bootcamp bevat in totaal 4 lessen.
Inleiding tot systemd en systemctl
systemd is het init-systeem en de servicebeheerder die door de meeste moderne Linux-distributies wordt gebruikt. Het is verantwoordelijk voor het starten, stoppen en beheren van systeemservices en voor het afhandelen van opstartreeksen en de systeemtoestand.
Het belangrijkste hulpmiddel voor interactie met systemd is systemctl. Hiermee kun je:
- services starten en stoppen
- services bij het opstarten in- of uitschakelen
- de status en logboeken van services bekijken
- de configuratie opnieuw laden zonder opnieuw te starten
Alle door systemd beheerde services worden beschreven door unit-bestanden. Dit zijn declaratieve configuratiebestanden die zijn opgeslagen in /etc/systemd/system/ (systeembreed) of ~/.config/systemd/user/ (per gebruiker).
Essentiële systemctl-opdrachten
Dit zijn de meest gebruikte systemctl-opdrachten voor het dagelijkse beheer van services. Elke opdracht werkt met een unitnaam, zoals nginx.service of simpelweg nginx.
systemctl start <unit>— een service onmiddellijk startensystemctl stop <unit>— een actieve service stoppensystemctl restart <unit>— stoppen en daarna starten (volledige herstart)systemctl reload <unit>— SIGHUP verzenden om de configuratie opnieuw te laden zonder te stoppensystemctl enable <unit>— symbolische koppelingen maken zodat de unit tijdens het opstarten wordt gestartsystemctl disable <unit>— die symbolische koppelingen verwijderensystemctl status <unit>— status, PID en recente logregels weergeven
#!/usr/bin/env bash
# Quick reference: inspect and control an nginx service
# (Requires nginx to be installed; run as root or with sudo)
systemctl status nginx
systemctl start nginx
systemctl enable nginx
systemctl reload nginx
systemctl restart nginx
systemctl stop nginx
systemctl disable nginxServicestatus in detail controleren
systemctl status geeft een uitgebreid overzicht van een unit. Als je de uitvoer begrijpt, kun je problemen snel diagnosticeren.
- Loaded: pad naar het unitbestand en of de unit tijdens het opstarten is ingeschakeld
- Active: huidige status —
active (running),inactive (dead),failed - Main PID: de proces-ID van het hoofdproces van de service
- CGroup: alle onderliggende processen die bij de service horen
- Logregels: de meest recente journaalvermeldingen voor deze unit
Je kunt ook alleen de actieve status opvragen met systemctl is-active en de ingeschakelde status met systemctl is-enabled. Die opdrachten zijn ideaal voor gebruik in scripts.
#!/usr/bin/env bash
# Script-friendly service health check
SERVICE="sshd"
if systemctl is-active --quiet "$SERVICE"; then
echo "$SERVICE is running."
else
echo "$SERVICE is NOT running. Attempting restart..."
systemctl restart "$SERVICE"
fi
if systemctl is-enabled --quiet "$SERVICE"; then
echo "$SERVICE is enabled at boot."
else
echo "WARNING: $SERVICE is not enabled at boot."
fiUnits weergeven en filteren
Als je veel services beheert, heb je efficiënte manieren nodig om units weer te geven en te filteren. systemctl list-units toont alle momenteel geladen units, terwijl list-unit-files alle geïnstalleerde unitbestanden en hun ingeschakelde status toont.
Handige filteropties:
--type=service— alleen service-units weergeven--state=failed— alleen mislukte units weergeven--state=active— alleen actieve units weergeven--all— inactieve units in de lijst opnemen
Door deze filters te combineren met grep kun je krachtige inspectiepijplijnen in onderhoudsscripts bouwen.
#!/usr/bin/env bash
# List all failed services and report them
echo "=== Failed Services ==="
systemctl list-units --type=service --state=failed --no-legend
echo ""
echo "=== Services Enabled at Boot ==="
systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'Opbouw van een systemd-service-unitbestand
Een service-unitbestand is een gewoon tekstbestand in INI-stijl dat uit secties bestaat. Elke sectie bepaalt een ander aspect van de levenscyclus van de unit.
- [Unit] — metagegevens: beschrijving en afhankelijkheden voor de volgorde (
After=,Requires=,Wants=) - [Service] — hoe het proces wordt gestart en gestopt:
ExecStart,ExecStop,Restart,User,WorkingDirectory - [Install] — wanneer deze unit moet worden ingeschakeld:
WantedBy=multi-user.targetbetekent dat deze tijdens normaal opstarten voor meerdere gebruikers wordt geactiveerd
Nadat je een unitbestand onder /etc/systemd/system/ hebt geplaatst of bewerkt, moet je systemctl daemon-reload uitvoeren zodat systemd de wijzigingen overneemt.
Je eerste service-unitbestand schrijven
We maken een eenvoudig service-unitbestand voor een aangepast Python HTTP-serverscript. Het unitbestand vertelt systemd precies hoe dit proces moet worden beheerd, net als elke andere systeemservice.
Belangrijke [Service]-richtlijnen die hier worden gebruikt:
Type=simple— systemd behandelt het proces vanExecStartals het hoofdprocesUser=www-data— uitvoeren onder een account dat geen rootaccount is, voor meer veiligheidWorkingDirectory— de werkmap van het proces instellenRestart=on-failure— automatisch opnieuw starten als het proces eindigt met een code die niet nul isRestartSec=5— 5 seconden wachten tussen pogingen om opnieuw te starten
#!/usr/bin/env bash
# Create a custom service unit file for a simple HTTP server
# Run as root
cat > /etc/systemd/system/mywebserver.service << 'EOF'
[Unit]
Description=My Custom Python Web Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mywebserver.service
systemctl status mywebserver.serviceServicetypen en levenscyclus van processen
De Type=-richtlijn in [Service] vertelt systemd hoe het moet bepalen wanneer een service klaar is met starten. Het kiezen van het verkeerde type is een veelvoorkomende oorzaak van fouten in de volgorde.
Type=simple— standaard; systemd beschouwt de service als gestart zodraExecStartwordt uitgevoerd. Er is geen signaal voor gereedheid nodig.Type=forking— het proces vanExecStartmaakt een fork en stopt; de echte daemon draait als onderliggend proces. GebruikPIDFile=zodat systemd het proces kan volgen.Type=notify— het proces verzendtsd_notify(READY=1)zodra het echt gereed is. Dit is het betrouwbaarst voor complexe daemons.Type=oneshot— wordt één keer uitgevoerd en stopt daarna; volgende units wachten tot de uitvoering is voltooid. Ideaal voor instelscripts.Type=idle— werkt zoals simple, maar de uitvoering wordt uitgesteld totdat alle actieve taken zijn voltooid.
#!/usr/bin/env bash
# Example: oneshot service for a database migration script
# /etc/systemd/system/db-migrate.service
cat > /etc/systemd/system/db-migrate.service << 'EOF'
[Unit]
Description=Run Database Migrations
After=postgresql.service
Requires=postgresql.service
[Service]
Type=oneshot
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/scripts/migrate.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start db-migrate.serviceOmgevingsvariabelen en beveiligingsversterking
Service-unitbestanden ondersteunen verschillende richtlijnen voor het doorgeven van omgevingsvariabelen en het toepassen van beveiligingsbeperkingen — beide zijn belangrijk in productiesystemen.
Richtlijnen voor omgevingsvariabelen:
Environment="KEY=value"— één variabele inline instellenEnvironmentFile=/etc/myapp/env— variabelen uit een bestand laden (éénKEY=valueper regel)
Veelgebruikte richtlijnen voor beveiligingsversterking:
NoNewPrivileges=true— voorkomen dat het proces extra rechten verkrijgt via setuidProtectSystem=strict—/usr,/booten/etcals alleen-lezen koppelenPrivateTmp=true— de service een eigen geïsoleerde/tmpgevenCapabilityBoundingSet=— alle Linux-mogelijkheden laten vallen
#!/usr/bin/env bash
# Hardened service unit with environment file
cat > /etc/systemd/system/secureapp.service << 'EOF'
[Unit]
Description=Secure Application Daemon
After=network.target
[Service]
Type=simple
User=secureapp
Group=secureapp
WorkingDirectory=/opt/secureapp
EnvironmentFile=/etc/secureapp/env
ExecStart=/opt/secureapp/bin/server
Restart=on-failure
RestartSec=10
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
CapabilityBoundingSet=
ReadWritePaths=/var/lib/secureapp /var/log/secureapp
[Install]
WantedBy=multi-user.target
EOF
# Create the environment file separately so secrets stay out of the unit file
install -m 600 -o secureapp /dev/null /etc/secureapp/env
echo 'APP_PORT=9000' >> /etc/secureapp/env
echo 'DB_URL=postgresql://localhost/mydb' >> /etc/secureapp/env
systemctl daemon-reloadInleiding tot systemd-timerunits
Een systemd-timer is een unit die volgens een schema een andere unit activeert (meestal een .service). Deze vervangt traditionele cron-taken door een meer geïntegreerd, logbaar en beheersbaar mechanisme.
Elke timerunit (foo.timer) wordt gekoppeld aan een service-unit met dezelfde basisnaam (foo.service) die het daadwerkelijke werk uitvoert. Je schakelt de timer in en start deze, niet de service rechtstreeks.
Timertypen:
- Realtime-timers (kalendertimers) — worden geactiveerd op kloktijden met
OnCalendar=-expressies zoalsdaily,weeklyofMon *-*-* 02:00:00 - Monotone timers — worden geactiveerd ten opzichte van een systeemgebeurtenis met
OnBootSec=,OnActiveSec=ofOnUnitActiveSec=
Een timer-unitbestand schrijven
We bouwen een volledig timer- en servicepaar dat elke dag om 02:00 een back-upscript uitvoert. Let erop dat de sectie [Timer] in een eigen .timer-bestand staat, terwijl het werk in het gekoppelde .service-bestand staat.
Belangrijke [Timer]-richtlijnen:
OnCalendar=— kalenderexpressie voor het schemaPersistent=true— als het systeem uit stond toen de timer had moeten worden geactiveerd, de taak onmiddellijk uitvoeren bij de volgende startRandomizedDelaySec=— maximaal N seconden willekeurige variatie toevoegen om een piekbelasting te voorkomen wanneer veel hosts hetzelfde schema gebruikenUnit=— expliciete doelunit (optioneel als de namen overeenkomen)
#!/usr/bin/env bash
# Create a daily backup timer pair
# Run as root
# 1. The service that does the work
cat > /etc/systemd/system/daily-backup.service << 'EOF'
[Unit]
Description=Daily Database Backup
After=network.target postgresql.service
[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup-db.sh
StandardOutput=journal
StandardError=journal
EOF
# 2. The timer that schedules it
cat > /etc/systemd/system/daily-backup.timer << 'EOF'
[Unit]
Description=Run Daily Database Backup at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now daily-backup.timer
# Verify
systemctl list-timers daily-backup.timerLogboeken inspecteren en problemen met units oplossen
systemd stuurt alle uitvoer van services naar het journaal, dat je opvraagt met journalctl. Hierdoor worden logboeken van alle units gecentraliseerd in één doorzoekbare opslag.
Essentiële journalctl-opties voor het oplossen van serviceproblemen:
-u <unit>— filteren op unitnaam-f— het logboek in realtime volgen (zoalstail -f)-n 50— alleen de laatste 50 regels weergeven--since "1 hour ago"— beperken op tijd-p err— alleen fouten met prioriteit error en hoger weergeven-b— alleen logboeken van de huidige opstartsessie weergeven
Als een unit niet kan starten, voer je eerst journalctl -u <unit> -n 30 --no-pager uit, gevolgd door systemctl status <unit>, om de recente foutcontext vast te leggen.
#!/usr/bin/env bash
# Troubleshooting helper: dump unit status and recent logs
# Usage: ./service-debug.sh <unit-name>
UNIT="${1:-nginx.service}"
echo "=============================="
echo "STATUS: $UNIT"
echo "=============================="
systemctl status "$UNIT" --no-pager -l
echo ""
echo "=============================="
echo "RECENT LOGS (last 50 lines): $UNIT"
echo "=============================="
journalctl -u "$UNIT" -n 50 --no-pager
echo ""
echo "=============================="
echo "ERRORS ONLY (current boot)"
echo "=============================="
journalctl -u "$UNIT" -b -p err --no-pagerKennischeck: systemd-unitbestanden
Test je begrip van de configuratie van systemd-service- en timer-units.
Lesoverzicht: systemd-services beheren en unitbestanden schrijven
In deze les heb je de kernconcepten van het beheer van systemd-services en het schrijven van unitbestanden op professioneel niveau verkend. Hier volgt een samenvatting van de behandelde onderwerpen:
- systemctl-basis — start, stop, restart, reload, enable, disable, status, is-active en is-enabled voor scriptvriendelijke controles
- Weergeven en filteren —
list-unitsenlist-unit-filesmet de opties--typeen--stateom mislukte of ingeschakelde services te isoleren - Opbouw van unitbestanden — de drie secties
[Unit],[Service]en[Install]en hun belangrijkste richtlijnen - Servicetypen —
simple,forking,notify,oneshoten wanneer je elk type gebruikt - Omgeving en beveiliging —
EnvironmentFile,NoNewPrivileges,ProtectSystemenPrivateTmpvoor beter beveiligde daemons - Timerunits —
.timer- en.service-bestanden koppelen,OnCalendar-expressies en inhaalgedrag metPersistent - Journalctl — filteren op unit, tijd, opstartsessie en prioriteit om fouten efficiënt te diagnosticeren
Met deze vaardigheden kun je elke systeemservice beheren, terugkerende taken betrouwbaar plannen en productieklare unitbestanden voor je eigen daemons schrijven.
Leer DevOps-bootcamp met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 142
- Lessen
- 568
Veelgestelde vragen
Is de les “systemd-services beheren en unitbestanden schrijven” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad DevOps-bootcamp, waaronder “systemd-services beheren en unitbestanden schrijven”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus DevOps-bootcamp bevat in totaal 4 lessen.
Wat leer ik in “systemd-services beheren en unitbestanden schrijven”?
Beheer services met systemctl en schrijf aangepaste unit- en timerbestanden voor scripted daemons. Je oefent met DevOps-bootcamp door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met DevOps-bootcamp te beginnen?
Ervaring vooraf is niet nodig. DevOps-bootcamp op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “systemd-services beheren en unitbestanden schrijven”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over DevOps-bootcamp?
Ja. Elke les over DevOps-bootcamp bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Gebruikers en groepen automatisch configureren
- systemd-services beheren en unitbestanden schrijven
- Schijven, bestandssystemen en mountbewerkingen automatiseren
- Scripts voor systeemcontroles en waarschuwingen bouwen