Styring af systemd-tjenester og skrivning af unit-filer
Styr tjenester med systemctl, og skriv brugerdefinerede unit- og timer-filer til scriptbaserede dæmoner.
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 sammesystemctl stop <unit>— stop en kørende tjenestesystemctl restart <unit>— stop og start igen (fuld genstart)systemctl reload <unit>— send SIGHUP for at genindlæse konfigurationen uden at stoppe tjenestensystemctl enable <unit>— opret symbolske links, så enheden starter ved opstartsystemctl disable <unit>— fjern disse symbolske linkssystemctl 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 nginxKontrol 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."
fiVisning 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.targetbetyder, 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 iExecStartsom hovedprocessenUser=www-data— kør under en konto, der ikke er root, af sikkerhedshensynWorkingDirectory— angiv processens arbejdsmappeRestart=on-failure— genstart automatisk, hvis processen afsluttes med en kode, der ikke er nulRestartSec=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.serviceTjenestetyper 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å snartExecStartstarter. Der kræves ikke noget klar-signal.Type=forking— processen iExecStartopretter en underproces og afsluttes; den egentlige dæmon kører som en underordnet proces. BrugPIDFile=, så systemd kan holde styr på den.Type=notify— processen sendersd_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.serviceMiljø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 direkteEnvironmentFile=/etc/myapp/env— indlæs variabler fra en fil (énKEY=valuepr. linje)
Almindelige direktiver til sikkerhedshærdning:
NoNewPrivileges=true— forhindre processen i at få yderligere privilegier via setuidProtectSystem=strict— montér/usr,/bootog/etcskrivebeskyttetPrivateTmp=true— giv tjenesten sin egen isolerede/tmpCapabilityBoundingSet=— 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-reloadIntroduktion 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 somdaily,weeklyellerMon *-*-* 02:00:00 - Monotone timere — udløses i forhold til en systemhændelse ved hjælp af
OnBootSec=,OnActiveSec=ellerOnUnitActiveSec=
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 tidsplanenPersistent=true— hvis systemet var slukket, da timeren skulle være udløst, køres den straks ved næste opstartRandomizedDelaySec=— 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 tidsplanUnit=— 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.timerInspektion 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 (somtail -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-pagerVidenstjek: 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-unitsoglist-unit-filesmed flagene--typeog--statefor at isolere mislykkede eller aktiverede tjenester - Enhedsfilens opbygning — de tre sektioner
[Unit],[Service]og[Install]samt deres vigtigste direktiver - Tjenestetyper —
simple,forking,notify,oneshotog hvornår hver type skal bruges - Miljø og sikkerhed —
EnvironmentFile,NoNewPrivileges,ProtectSystemogPrivateTmptil hærdede dæmoner - Timerenheder — parring af
.timer- og.service-filer,OnCalendar-udtryk ogPersistent-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.
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
- Automatisering af bruger- og gruppeoprettelse
- Styring af systemd-tjenester og skrivning af unit-filer
- Automatisering af diske, filsystemer og mount
- Opbygning af scripts til systemtilstand og alarmer