Modul 6 · 6.1
Upravljanje storitev s systemd
Modul 6: Storitve in dnevniki · Čas branja: 10 minut
Učni cilj: Po tej lekciji boste znali storitve zagnati, ustaviti, ponovno naložiti in nastaviti, da se zaženejo ob zagonu sistema, prebrati stanje storitve ter varno spremeniti nastavitev storitve z datoteko drop-in.
Ključni pojmi: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Kdo skrbi, da vse deluje?
Na strežniku teče na desetine programov, ki morajo biti vedno na voljo: strežnik SSH, spletni strežnik, podatkovna baza, sinhronizacija časa. Takšnim programom pravimo storitve (services ali daemons). Nekdo jih mora ob zagonu sistema zagnati, jih nadzorovati in jih znova zagnati, če se sesujejo. Na Debianu, Ubuntuju, AlmaLinuxu in Rocky Linuxu to počne systemd. To je prvi program, ki ga zažene jedro (proces 1), nato pa zažene vse ostalo.
systemd dela z enotami (units): opisi nečesa, kar mora upravljati. Najpomembnejše vrste:
| Vrsta | Končnica | Primer |
|---|---|---|
| Storitev | .service | nginx.service, ssh.service |
| Časovnik (načrtovano opravilo) | .timer | apt-daily.timer (lekcija 4.2, lekcija 6.3) |
| Vtičnica (socket) | .socket | ssh.socket na Ubuntuju 24.04 in novejših |
| Cilj (skupina enot) | .target | multi-user.target |
S systemd se pogovarjate prek ukaza systemctl. Končnico .service lahko izpustite: systemctl status nginx je isto kot systemctl status nginx.service.
Branje stanja
Ukaz, ki ga boste uporabljali najpogosteje:
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...Berite ga od zgoraj navzdol:
- Pikica pred imenom je zelena pri storitvi, ki teče, bela pri ustavljeni in rdeča pri neuspešni.
- Loaded pove, kje je datoteka enote in ali se storitev zažene ob zagonu sistema (
enabled) ali ne (disabled). - Active pove, ali storitev zdaj teče (
active (running)), je ustavljena (inactive (dead)) ali ni uspela (failed), in od kdaj. - Main PID in CGroup pokažeta, kateri procesi spadajo k storitvi.
- Spodaj so zadnje vrstice iz dnevnika storitve. Pogosto je tam že zapisano, zakaj gre kaj narobe; več preberete z
journalctl(lekcija 6.2).
Zagon, ustavitev, ponovni zagon in ponovno nalaganje
anna@web1:~$ sudo systemctl start nginx # zaženite zdaj
anna@web1:~$ sudo systemctl stop nginx # ustavite zdaj
anna@web1:~$ sudo systemctl restart nginx # ustavite in znova zaženite
anna@web1:~$ sudo systemctl reload nginx # znova preberite konfiguracijo brez ustavitveRazlika med restart in reload je v praksi pomembna. Pri ponovnem zagonu (restart) se storitev za trenutek ustavi: odprte povezave se prekinejo, in če nova konfiguracija vsebuje napako, se storitev ne zažene več in Vaše spletno mesto ne deluje. Pri ponovnem nalaganju (reload) storitev znova prebere svojo konfiguracijo, medtem ko teče naprej; pri napaki v konfiguraciji nginx obdrži staro. Za nginx, Caddy, SSH in fail2ban po spremembi konfiguracije zato uporabite reload in konfiguracijo najprej preizkusite (nginx -t, sshd -t, fail2ban-client -t). Vse storitve ne poznajo ukaza reload; systemctl reload-or-restart izbere sam.
Ob zagonu sistema: enable in disable
Zagon in "zagon ob zagonu sistema" sta dve različni stvari:
anna@web1:~$ sudo systemctl enable nginx # odslej se zažene ob zagonu sistema
anna@web1:~$ sudo systemctl disable nginx # ne zažene se več ob zagonu sistema
anna@web1:~$ sudo systemctl enable --now nginx # oboje: zaženite zdaj in ob zagonu sistema
anna@web1:~$ systemctl is-enabled nginx
enabledKlasična napaka: storitev zaženete z start, vse deluje, po naslednjem ponovnem zagonu strežnika (na primer zaradi posodobitve jedra, lekcija 4.2) pa je ni več. Za novo storitev zato uporabite enable --now.
Če želite biti prepričani, da se storitev nikoli ne zažene, tudi če jo zahteva druga storitev, obstaja mask: sudo systemctl mask <dienst>. To razveljavite z unmask.
Kaj je narobe?
En ukaz pokaže vse neuspešne enote:
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.Naj Vam to postane navada, na primer po vsakem ponovnem zagonu in vsaki nadgradnji (lekcija 4.3): seznam mora biti prazen. Ko težavo odpravite, obvestilo odstranite z sudo systemctl reset-failed.
Pregled vseh storitev, ki tečejo:
anna@web1:~$ systemctl list-units --type=service --state=runningČe teče nekaj, česar ne poznate ali ne uporabljate, ugotovite, kaj to je. Vsaka storitev, ki ni potrebna, je odvečna površina za napad (lekcija 5.1 in 10.1).
Datoteke enot in drop-in
Datoteka enote je besedilna datoteka. Različica iz paketa je v /usr/lib/systemd/system/ (na starejših sistemih /lib/systemd/system/). Te datoteke nikoli ne spreminjajte: posodobitev paketa jo prepiše. Lastne spremembe zapišite v drop-in: majhno datoteko, ki vsebuje le vrstice, ki jih želite spremeniti. Najlažje to naredite z:
anna@web1:~$ sudo systemctl edit nginxOdpre se urejevalnik s praznim delom med dvema vrsticama s komentarjem. Kar tja zapišete, se shrani v /etc/systemd/system/nginx.service.d/override.conf. Na primer: nginx naj se samodejno znova zažene, če se nepričakovano ustavi.
[Service]
Restart=on-failure
RestartSec=5sKo shranite, systemctl edit sam ponovno naloži konfiguracijo systemd. Če datoteko enote urejate drugače, to naredite sami:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload poskrbi, da systemd znova prebere datoteke enot; storitev pa morate nato še ponovno zagnati, da začne uporabljati spremembo. Celoten rezultat (izvirnik in datoteke drop-in) vidite z systemctl cat nginx.
Restart=on-failure je dobra navada za pomembne storitve. Vendar z njim ne skrivajte prave napake: storitev, ki se vsakih pet sekund sesuje in znova zažene, je treba raziskati v dnevniku. systemd po nekaj hitrih zaporednih neuspehih preneha s ponovnimi zagoni (privzeta meja je pet zagonov v desetih sekundah) in storitev označi kot failed.
Na AlmaLinuxu in Rocky Linuxu
systemd in systemctl delujeta povsem enako. Le imena storitev se včasih razlikujejo: storitev SSH se imenuje sshd, spletni strežnik iz distribucije httpd (Apache) ali nginx, požarni zid pa firewalld.
V praksi
Zaslon VPS pri Vašem ponudniku (pri WebOké in drugod) lahko celoten strežnik izklopi, ponovno zažene ali "prisilno izklopi". Slednje je kot izvlek vtiča: storitve nimajo možnosti, da bi se pravilno ustavile, in podatkovna baza se lahko poškoduje. Znotraj strežnika uporabite sudo systemctl reboot ali sudo shutdown -h now, v nadzorni plošči pa običajni gumb za izklop ali ponovni zagon.
Povzetek
- systemd zažene in nadzoruje vse storitve; upravljate ga z
systemctl. systemctl statuspokaže, ali storitev teče, ali se zažene ob zagonu sistema, in zadnje vrstice dnevnika.start/stop/restartveljajo za zdaj,enable/disableza zagon sistema; za novo storitev uporabiteenable --now.- Po spremembi konfiguracije: najprej preizkus, nato
reload;systemctl --failedmora biti prazen. - Datoteke enote iz paketa nikoli ne spreminjajte, temveč uporabite drop-in z
systemctl edit.
Kviz
Naloga
Naloga O6.1: Pregled Vaših storitev. Na svojem strežniku naredite seznam vseh storitev, ki tečejo (systemctl list-units --type=service --state=running), in preverite, ali je systemctl --failed prazen. Za vsako storitev navedite, kaj počne in ali jo potrebujete. Za eno storitev, ki je niste poznali, ugotovite, kaj je (systemctl status, man). Nato za eno pomembno storitev nastavite Restart=on-failure v datoteki drop-in in z systemctl cat preverite, da je nastavitev tam.
Naloga O6.1: Pregled Vaših storitev
To nalogo opravite sami; nihče je ne pregleda. Odkljukajte, kar ste naredili, in nalogo označite kot opravljeno.
Drop-in je v /etc/systemd/system/<naam>.service.d/override.conf, ne v /usr/lib/systemd. Pri reload storitev teče naprej in na primer nginx ob napaki obdrži staro konfiguracijo; vnaprej preizkusite z nginx -t ali sshd -t. Odvečne storitve: disable --now ali odstranite paket.
Vaše kljukice in zapiski ostanejo samo v tem brskalniku, nikamor jih ne pošiljamo. Če ste prijavljeni, v Moji tečaji shranimo samo podatek, da ste nalogo opravili.
Za nadaljnje branje
- Priročnik
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Priročnik
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Priročnik
systemd.unit(5)(drop-in): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
