Modul 6 · 6.1
Hantera tjänster med systemd
Modul 6: Tjänster och loggar · Lästid: 10 minuter
Lärandemål: Efter den här lektionen kan du starta, stoppa och ladda om tjänster och låta dem starta vid uppstart, läsa statusen för en tjänst och ändra en inställning för en tjänst på ett säkert sätt med en drop-in.
Nyckelbegrepp: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Vem håller allt igång?
På en server körs dussintals program som alltid måste finnas där: SSH-servern, webbservern, en databas, tidssynkroniseringen. Sådana program kallas tjänster (services, eller daemons). Någon måste starta dem vid uppstart, hålla koll på dem och starta om dem när de kraschar. På Debian, Ubuntu, AlmaLinux och Rocky Linux gör systemd det. Det är det första programmet som kärnan startar (process 1), och sedan startar det allt annat.
systemd arbetar med units: beskrivningar av något som det ska hantera. De viktigaste typerna:
| Typ | Filändelse | Exempel |
|---|---|---|
| Tjänst | .service | nginx.service, ssh.service |
| Timer (schemalagd uppgift) | .timer | apt-daily.timer (lektion 4.2, lektion 6.3) |
| Socket | .socket | ssh.socket på Ubuntu 24.04 och senare |
| Mål (grupp av units) | .target | multi-user.target |
Du pratar med systemd via kommandot systemctl. Filändelsen .service kan du utelämna: systemctl status nginx är samma sak som systemctl status nginx.service.
Läsa statusen
Kommandot som du använder oftast:
anna@web1:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-11-09 08:12:44 CET; 3h 2min ago
Docs: man:nginx(8)
Process: 902 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 905 (nginx)
Tasks: 3 (limit: 2275)
Memory: 4.1M (peak: 6.3M)
CPU: 213ms
CGroup: /system.slice/nginx.service
├─905 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─906 "nginx: worker process"
nov 09 08:12:44 web1 systemd[1]: Starting nginx.service - A high performance web server...
nov 09 08:12:44 web1 systemd[1]: Started nginx.service - A high performance web server...Läs det uppifrån och ned:
- Pricken framför namnet är grön för en tjänst som körs, vit för en som är stoppad och röd för en som har misslyckats.
- Loaded visar var unit-filen finns och om tjänsten startar vid uppstart (
enabled) eller inte (disabled). - Active visar om den körs just nu (
active (running)), är stoppad (inactive (dead)) eller har misslyckats (failed), och sedan när. - Main PID och CGroup visar vilka processer som hör till tjänsten.
- Längst ned står de senaste raderna ur tjänstens logg. Där står ofta redan varför något går fel; mer läser du med
journalctl(lektion 6.2).
Starta, stoppa, starta om och ladda om
anna@web1:~$ sudo systemctl start nginx # starta nu
anna@web1:~$ sudo systemctl stop nginx # stoppa nu
anna@web1:~$ sudo systemctl restart nginx # stoppa och starta igen
anna@web1:~$ sudo systemctl reload nginx # läs in konfigurationen igen utan att stoppaSkillnaden mellan restart och reload är viktig i praktiken. Vid en restart stoppas tjänsten en kort stund: pågående anslutningar bryts, och om den nya konfigurationen innehåller ett fel startar den inte igen och din webbplats ligger nere. Vid en reload läser tjänsten in sin konfiguration på nytt medan den fortsätter att köras; vid ett fel i konfigurationen behåller nginx den gamla. Använd därför reload för nginx, Caddy, SSH och fail2ban efter en konfigurationsändring, och testa konfigurationen först (nginx -t, sshd -t, fail2ban-client -t). Alla tjänster har inte stöd för reload; systemctl reload-or-restart väljer själv.
Vid uppstart: enable och disable
Att starta och att "starta vid uppstart" är två olika saker:
anna@web1:~$ sudo systemctl enable nginx # startar hädanefter vid uppstart
anna@web1:~$ sudo systemctl disable nginx # inte längre vid uppstart
anna@web1:~$ sudo systemctl enable --now nginx # båda: starta nu och vid uppstart
anna@web1:~$ systemctl is-enabled nginx
enabledEtt klassiskt misstag: du startar en tjänst med start, allt fungerar, och efter nästa omstart (till exempel på grund av en kärnuppdatering, lektion 4.2) är den borta. Använd därför enable --now för en ny tjänst.
Vill du vara säker på att en tjänst aldrig startar, inte ens om en annan tjänst begär det, finns mask: sudo systemctl mask <dienst>. Ångra med unmask.
Vad är fel?
Ett enda kommando visar alla units som har misslyckats:
anna@web1:~$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● php8.4-fpm.service loaded failed failed The PHP 8.4 FastCGI Process Manager
1 loaded units listed.Gör det till en vana, till exempel efter varje omstart och varje uppgradering (lektion 4.3): listan ska vara tom. När du har löst problemet tar du bort meddelandet med sudo systemctl reset-failed.
En översikt över alla tjänster som körs:
anna@web1:~$ systemctl list-units --type=service --state=runningKörs det något som du inte känner igen eller inte använder, ta då reda på vad det är. Varje tjänst som inte behövs är onödig attackyta (lektion 5.1 och 10.1).
Unit-filer och drop-ins
En unit-fil är en textfil. Paketets version finns i /usr/lib/systemd/system/ (på äldre system /lib/systemd/system/). Den ändrar du aldrig: en uppdatering av paketet skriver över den. Egna ändringar lägger du i en drop-in: en liten fil som bara innehåller de rader som du vill ändra. Det går enklast med:
anna@web1:~$ sudo systemctl edit nginxEn editor öppnas med ett tomt utrymme mellan två kommentarsrader. Det du skriver där hamnar i /etc/systemd/system/nginx.service.d/override.conf. Till exempel: starta om nginx automatiskt om den stoppar oväntat.
[Service]
Restart=on-failure
RestartSec=5sNär du sparar laddar systemctl edit om systemds konfiguration automatiskt. Redigerar du en unit-fil på något annat sätt, kör då själv:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload får systemd att läsa in unit-filerna på nytt; själva tjänsten måste sedan fortfarande startas om för att använda ändringen. Hela resultatet (originalet plus drop-ins) ser du med systemctl cat nginx.
Restart=on-failure är en bra vana för viktiga tjänster. Men dölj inte ett verkligt fel med den: en tjänst som kraschar och startar om var femte sekund ska undersökas i loggen. systemd slutar starta om efter några snabba misslyckanden i följd (standardgränsen är fem starter inom tio sekunder) och sätter tjänsten till failed.
På AlmaLinux och Rocky Linux
systemd och systemctl fungerar precis likadant. Bara tjänsternas namn skiljer sig ibland: SSH-tjänsten heter sshd, distributionens webbserver heter httpd (Apache) eller nginx, och brandväggen firewalld.
I praktiken
VPS-panelen hos din leverantör (hos WebOké och andra) kan stänga av hela servern, starta om den eller "tvinga avstängning". Det sista motsvarar att dra ur sladden: tjänsterna får ingen chans att stoppa ordentligt och en databas kan då skadas. Använd sudo systemctl reboot eller sudo shutdown -h now inne på servern, och i panelen den vanliga knappen för avstängning eller omstart.
Sammanfattning
- systemd startar och övervakar alla tjänster; du styr det med
systemctl. systemctl statusvisar om en tjänst körs, om den startar vid uppstart och de senaste loggraderna.start/stop/restartgäller för stunden,enable/disableför uppstarten; användenable --nowför en ny tjänst.- Efter en konfigurationsändring: testa först, sedan
reload;systemctl --failedska vara tom. - Ändra aldrig ett pakets unit-fil, utan använd en drop-in med
systemctl edit.
Quiz
Uppgift
Uppgift O6.1: Kartlägg dina tjänster. Gör en lista på din server över alla tjänster som körs (systemctl list-units --type=service --state=running) och kontrollera om systemctl --failed är tom. Ange för varje tjänst vad den gör och om du behöver den. Ta reda på vad en tjänst som du inte kände till är (systemctl status, man). Lägg sedan in Restart=on-failure i en drop-in för en viktig tjänst och kontrollera med systemctl cat att den finns där.
Uppgift O6.1: Kartlägg dina tjänster
Den här uppgiften gör du själv; ingen kontrollerar den. Bocka av vad du har gjort och markera uppgiften som klar.
En drop-in ligger i /etc/systemd/system/<naam>.service.d/override.conf, inte i /usr/lib/systemd. Vid reload fortsätter tjänsten att köra och till exempel nginx behåller den gamla konfigurationen vid ett fel; testa i förväg med nginx -t eller sshd -t. Onödiga tjänster: disable --now eller ta bort paketet.
Dina bockar och anteckningar sparas bara i den här webbläsaren; vi skickar dem ingenstans. Är du inloggad sparar vi i Mina kurser bara att du har gjort uppgiften.
Läs mer
- Manual
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Manual
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Manual
systemd.unit(5)(drop-ins): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html - Hantera tjänster med systemctl på din VPS
