Linux-kommandolinjen og Bash-scripting på ekspertniveau · Lektion

Styring af systemd-tjenester og skrivning af unit-filer

Styr tjenester med systemctl, og skriv brugerdefinerede unit- og timer-filer til scriptbaserede dæmoner.

Lektion 2 af 413 trin

Styring af systemd-tjenester og skrivning af unit-filer er en gratis Linux-kommandolinjen og Bash-scripting på ekspertniveau-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Linux-kommandolinjen og Bash-scripting på ekspertniveau, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Linux-kommandolinjen og Bash-scripting på ekspertniveau-kurset indeholder 4 lektioner i alt.

Introduktion til systemd og systemctl

systemd er det init-system og den serviceadministrator, som bruges af de fleste moderne Linux-distributioner. Det er ansvarligt for at starte, stoppe og administrere systemtjenester samt for at håndtere opstartssekvenser og systemtilstand.

Det primære værktøj til interaktion med systemd er systemctl. Med det kan du:

  • Starte og stoppe tjenester
  • Aktivere eller deaktivere tjenester ved opstart
  • Undersøge tjenestestatus og logfiler
  • Genindlæse konfigurationen uden at genstarte

Alle tjenester, der administreres af systemd, er defineret af unit-filer, som er deklarative konfigurationsfiler gemt under /etc/systemd/system/ (systemdækkende) eller ~/.config/systemd/user/ (pr. bruger).

Vigtige systemctl-kommandoer

Dette er de mest anvendte systemctl-kommandoer til daglig administration af tjenester. Hver kommando arbejder på et enhedsnavn som nginx.service eller blot nginx.

  • systemctl start <unit> — start en tjeneste med det samme
  • systemctl stop <unit> — stop en kørende tjeneste
  • systemctl restart <unit> — stop og start igen (fuld genstart)
  • systemctl reload <unit> — send SIGHUP for at genindlæse konfigurationen uden at stoppe tjenesten
  • systemctl enable <unit> — opret symbolske links, så enheden starter ved opstart
  • systemctl disable <unit> — fjern disse symbolske links
  • systemctl status <unit> — vis tilstand, PID og de seneste loglinjer
#!/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 nginx

Kontrol af tjenestestatus i detaljer

systemctl status giver et omfattende øjebliksbillede af en enhed. Det er vigtigt at forstå outputtet, hvis du hurtigt skal diagnosticere problemer.

  • Loaded: sti til enhedsfilen, og om den er aktiveret ved opstart
  • Active: den aktuelle tilstand — active (running), inactive (dead), failed
  • Main PID: procesidentifikatoren for tjenestens hovedproces
  • CGroup: alle underordnede processer, der tilhører tjenesten
  • Loglinjer: de seneste journalposter for denne enhed

Du kan også kun forespørge på den aktive tilstand med systemctl is-active og den aktiverede tilstand med systemctl is-enabled. Det er ideelt, når kommandoerne bruges i 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."
fi

Visning og filtrering af enheder

Når du administrerer mange tjenester, har du brug for effektive måder at vise og filtrere enheder på. systemctl list-units viser alle aktuelt indlæste enheder, mens list-unit-files viser alle installerede enhedsfiler og deres aktiverede tilstand.

Nyttige filtreringsindstillinger:

  • --type=service — vis kun tjenesteenheder
  • --state=failed — vis kun enheder, der er mislykkedes
  • --state=active — vis kun aktive enheder
  • --all — medtag inaktive enheder i visningen

Hvis du kombinerer disse filtre med grep, kan du opbygge effektive inspektionsbehandlingskæder i vedligeholdelsesscripts.

#!/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}'

Opbygningen af en systemd-tjenesteenhedsfil

En tjenesteenhedsfil er en almindelig tekstfil i INI-format, der består af sektioner. Hver sektion styrer et forskelligt aspekt af enhedens livscyklus.

  • [Unit] — metadata: beskrivelse og rækkefølgeafhængigheder (After=, Requires=, Wants=)
  • [Service] — hvordan processen startes og stoppes: ExecStart, ExecStop, Restart, User, WorkingDirectory
  • [Install] — hvornår denne enhed skal aktiveres: WantedBy=multi-user.target betyder, at den aktiveres under normal opstart i flerbrugertilstand

Når du har placeret eller redigeret en enhedsfil under /etc/systemd/system/, skal du køre systemctl daemon-reload, så systemd indlæser ændringerne.

Skriv din første tjenesteenhedsfil

Lad os oprette en enkel tjenesteenhedsfil til et brugerdefineret Python-script, der fungerer som HTTP-server. Enhedsfilen fortæller systemd præcis, hvordan denne proces skal administreres, som var den enhver anden systemtjeneste.

De vigtigste direktiver i [Service], der bruges her:

  • Type=simple — systemd behandler processen i ExecStart som hovedprocessen
  • User=www-data — kør under en konto, der ikke er root, af sikkerhedshensyn
  • WorkingDirectory — angiv processens arbejdsmappe
  • Restart=on-failure — genstart automatisk, hvis processen afsluttes med en kode, der ikke er nul
  • RestartSec=5 — vent 5 sekunder mellem forsøg på genstart
#!/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.service

Tjenestetyper og processens livscyklus

Direktivet Type= i [Service] fortæller systemd, hvordan det skal holde styr på, hvornår en tjeneste er færdig med at starte. Det er en almindelig årsag til rækkefølgefejl at vælge den forkerte type.

  • Type=simple — standardtypen; systemd betragter tjenesten som startet, så snart ExecStart starter. Der kræves ikke noget klar-signal.
  • Type=forking — processen i ExecStart opretter en underproces og afsluttes; den egentlige dæmon kører som en underordnet proces. Brug PIDFile=, så systemd kan holde styr på den.
  • Type=notify — processen sender sd_notify(READY=1), når den reelt er klar. Dette er mest pålideligt for komplekse dæmoner.
  • Type=oneshot — kører én gang og afsluttes; efterfølgende enheder venter på, at den bliver færdig. Ideelt til opsætningsscripts.
  • Type=idle — fungerer som simple, men udførelsen forsinkes, indtil alle aktive job er afsluttet.
#!/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.service

Miljøvariabler og sikkerhedshærdning

Tjenesteenhedsfiler understøtter flere direktiver til videregivelse af miljøvariabler og anvendelse af sikkerhedsbegrænsninger — begge dele er vigtigt i produktionssystemer.

Direktiver for miljøvariabler:

  • Environment="KEY=value" — angiv en enkelt variabel direkte
  • EnvironmentFile=/etc/myapp/env — indlæs variabler fra en fil (én KEY=value pr. linje)

Almindelige direktiver til sikkerhedshærdning:

  • NoNewPrivileges=true — forhindre processen i at få yderligere privilegier via setuid
  • ProtectSystem=strict — montér /usr, /boot og /etc skrivebeskyttet
  • PrivateTmp=true — giv tjenesten sin egen isolerede /tmp
  • CapabilityBoundingSet= — fjern alle Linux-funktioner
#!/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-reload

Introduktion til systemd-timerenheder

En systemd-timer er en enhed, der aktiverer en anden enhed (normalt en .service) efter en tidsplan. Den erstatter traditionelle cron-job med en mere integreret, logbar og styrbar mekanisme.

Hver timerenhed (foo.timer) har en tilknyttet tjenesteenhed med samme grundnavn (foo.service), som udfører det faktiske arbejde. Du aktiverer og starter timeren, ikke tjenesten direkte.

Timertyper:

  • Realtids-timere (kalendertimere) — udløses på klokkeslæt ved hjælp af OnCalendar=-udtryk som daily, weekly eller Mon *-*-* 02:00:00
  • Monotone timere — udløses i forhold til en systemhændelse ved hjælp af OnBootSec=, OnActiveSec= eller OnUnitActiveSec=

Skriv en timerenhedsfil

Lad os opbygge et komplet timer- og tjenestepar, der kører et sikkerhedskopieringsscript hver dag kl. 02.00. Bemærk, hvordan sektionen [Timer] ligger i sin egen .timer-fil, mens arbejdet ligger i den tilknyttede .service-fil.

Vigtige direktiver i [Timer]:

  • OnCalendar= — kalenderudtryk for tidsplanen
  • Persistent=true — hvis systemet var slukket, da timeren skulle være udløst, køres den straks ved næste opstart
  • RandomizedDelaySec= — tilføj op til N sekunders tilfældig variation for at forhindre en storm af samtidige forespørgsler, når mange værter deler den samme tidsplan
  • Unit= — eksplicit målenhed (valgfrit, hvis navnene stemmer overens)
#!/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.timer

Inspektion af logge og fejlfinding af enheder

systemd sender alt output fra tjenester til journalen, som du forespørger i med journalctl. Det samler logge fra alle enheder i ét søgbart lager.

Vigtige journalctl-flag til fejlfinding af tjenester:

  • -u <unit> — filtrér efter enhedsnavn
  • -f — følg loggen i realtid (som tail -f)
  • -n 50 — vis kun de sidste 50 linjer
  • --since "1 hour ago" — begræns efter tid
  • -p err — vis kun fejl med denne eller højere prioritet
  • -b — vis kun logge fra den aktuelle opstart

Når en enhed ikke kan starte, skal du først køre journalctl -u <unit> -n 30 --no-pager og derefter systemctl status <unit> for at få den seneste fejlkontekst med.

#!/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-pager

Videnstjek: systemd-enhedsfiler

Test din forståelse af konfiguration af systemd-tjeneste- og timerenheder.

Opsummering af lektionen: Styring af systemd-tjenester og skrivning af enhedsfiler

I denne lektion har du gennemgået de centrale begreber inden for administration af systemd-tjenester og skrivning af enhedsfiler på professionelt niveau. Her er en opsummering af det, du har arbejdet med:

  • Grundlæggende systemctl — start, stop, genstart, genindlæsning, aktivering, deaktivering, status, is-active og is-enabled til scriptvenlige kontroller
  • Visning og filtrering — list-units og list-unit-files med flagene --type og --state for at isolere mislykkede eller aktiverede tjenester
  • Enhedsfilens opbygning — de tre sektioner [Unit], [Service] og [Install] samt deres vigtigste direktiver
  • Tjenestetyper — simple, forking, notify, oneshot og hvornår hver type skal bruges
  • Miljø og sikkerhed — EnvironmentFile, NoNewPrivileges, ProtectSystem og PrivateTmp til hærdede dæmoner
  • Timerenheder — parring af .timer- og .service-filer, OnCalendar-udtryk og Persistent-håndtering af mistede kørselstidspunkter
  • Journalctl — filtrering efter enhed, tid, opstart og prioritet for effektiv diagnosticering af fejl

Med disse færdigheder kan du administrere enhver systemtjeneste, planlægge gentagne opgaver pålideligt og skrive produktionsklare enhedsfiler til dine egne dæmoner.

Gratis at komme i gang

Lær Bash med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
22
Lektioner
88

Ofte stillede spørgsmål

Er lektionen “Styring af systemd-tjenester og skrivning af unit-filer” gratis?

Ja — hele teksten til “Styring af systemd-tjenester og skrivning af unit-filer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Linux-kommandolinjen og Bash-scripting på ekspertniveau-kurset, skal du opgradere til CoddyKit PRO. Linux-kommandolinjen og Bash-scripting på ekspertniveau-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Styring af systemd-tjenester og skrivning af unit-filer”?

Styr tjenester med systemctl, og skriv brugerdefinerede unit- og timer-filer til scriptbaserede dæmoner. Du øver dig i Linux-kommandolinjen og Bash-scripting på ekspertniveau med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Linux-kommandolinjen og Bash-scripting på ekspertniveau?

Der kræves ingen tidligere erfaring. Linux-kommandolinjen og Bash-scripting på ekspertniveau på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Styring af systemd-tjenester og skrivning af unit-filer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Linux-kommandolinjen og Bash-scripting på ekspertniveau-lektion?

Ja. Alle Linux-kommandolinjen og Bash-scripting på ekspertniveau-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Automatisering af bruger- og gruppeoprettelse
  2. Styring af systemd-tjenester og skrivning af unit-filer
  3. Automatisering af diske, filsystemer og mount
  4. Opbygning af scripts til systemtilstand og alarmer
← Tilbage til Linux-kommandolinjen og Bash-scripting på ekspertniveau