Správa služeb pomocí systemd
Modul 6: Služby a logy · Doba čtení: 10 min.
Cíl lekce: Po této lekci budete umět spouštět, zastavovat a znovu načítat služby a nastavit jejich spuštění při startu systému, číst stav služby a bezpečně změnit nastavení služby pomocí drop-inu.
Klíčové pojmy: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Kdo udržuje vše v chodu?
Na serveru běží desítky programů, které musí být k dispozici neustále: SSH server, webový server, databáze, synchronizace času. Takovým programům se říká služby (services, neboli daemony). Někdo je musí při startu systému spustit, hlídat je a znovu spustit, když spadnou. Na Debianu, Ubuntu, AlmaLinuxu a Rocky Linuxu to dělá systemd. Je to první program, který jádro spustí (proces 1), a ten pak spouští vše ostatní.
systemd pracuje s units (jednotkami): popisy něčeho, co má spravovat. Nejdůležitější druhy:
| Druh | Přípona | Příklad |
|---|---|---|
| Služba | .service | nginx.service, ssh.service |
| Časovač (plánovaná úloha) | .timer | apt-daily.timer (lekce 4.2, lekce 6.3) |
| Socket | .socket | ssh.socket na Ubuntu 24.04 a novějším |
| Cíl (skupina units) | .target | multi-user.target |
Se systemd komunikujete pomocí příkazu systemctl. Příponu .service můžete vynechat: systemctl status nginx je totéž co systemctl status nginx.service.
Čtení stavu
Příkaz, který budete používat nejčastěji:
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...Čtěte jej shora dolů:
- Kolečko před názvem je zelené u běžící služby, bílé u zastavené a červené u služby, která selhala.
- Loaded říká, kde je soubor unit uložen a zda se služba spouští při startu systému (
enabled), nebo ne (disabled). - Active říká, zda služba právě běží (
active (running)), je zastavená (inactive (dead)), nebo selhala (failed), a od kdy. - Main PID a CGroup ukazují, které procesy ke službě patří.
- Dole jsou poslední řádky z logu služby. Často se tam už dočtete, proč se něco pokazilo; více uvidíte pomocí
journalctl(lekce 6.2).
Spuštění, zastavení, restart a opětovné načtení
anna@web1:~$ sudo systemctl start nginx # spustit nyní
anna@web1:~$ sudo systemctl stop nginx # zastavit nyní
anna@web1:~$ sudo systemctl restart nginx # zastavit a znovu spustit
anna@web1:~$ sudo systemctl reload nginx # znovu načíst konfiguraci bez zastaveníRozdíl mezi restart a reload je v praxi důležitý. Při restartu se služba na chvíli zastaví: probíhající spojení se přeruší, a pokud nová konfigurace obsahuje chybu, služba se už nespustí a Váš web nefunguje. Při reloadu služba znovu načte svou konfiguraci a přitom dál běží; při chybě v konfiguraci si nginx ponechá tu starou. Pro nginx, Caddy, SSH a fail2ban proto po změně konfigurace používejte reload a konfiguraci nejprve otestujte (nginx -t, sshd -t, fail2ban-client -t). Ne každá služba reload podporuje; systemctl reload-or-restart si vybere sám.
Při startu systému: enable a disable
Spustit službu a nastavit, aby se „spouštěla při startu systému“, jsou dvě různé věci:
anna@web1:~$ sudo systemctl enable nginx # nově se spouští při startu systému
anna@web1:~$ sudo systemctl disable nginx # už se nespouští při startu systému
anna@web1:~$ sudo systemctl enable --now nginx # obojí: spustit nyní i při startu systému
anna@web1:~$ systemctl is-enabled nginx
enabledKlasická chyba: službu spustíte pomocí start, vše funguje, a po dalším restartu (například kvůli aktualizaci jádra, lekce 4.2) je pryč. Pro novou službu proto používejte enable --now.
Chcete-li mít jistotu, že se služba nikdy nespustí, ani když si o ni řekne jiná služba, existuje mask: sudo systemctl mask <dienst>. Vrátit zpět to můžete pomocí unmask.
Co je špatně?
Jeden příkaz ukáže všechny units, které selhaly:
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.Udělejte si z toho zvyk, například po každém restartu a každém upgradu (lekce 4.3): seznam by měl být prázdný. Po vyřešení problému hlášení odstraníte pomocí sudo systemctl reset-failed.
Přehled všech běžících služeb:
anna@web1:~$ systemctl list-units --type=service --state=runningPokud běží něco, co neznáte nebo nepoužíváte, zjistěte, co to je. Každá služba, která není potřeba, je zbytečná plocha pro útok (lekce 5.1 a 10.1).
Soubory unit a drop-iny
Soubor unit je textový soubor. Verze z balíčku je uložena v /usr/lib/systemd/system/ (na starších systémech /lib/systemd/system/). Tu nikdy neupravujte: aktualizace balíčku ji přepíše. Vlastní změny patří do drop-inu: malého souboru, který obsahuje jen ty řádky, které chcete změnit. Nejsnáze to uděláte takto:
anna@web1:~$ sudo systemctl edit nginxOtevře se editor s prázdným místem mezi dvěma řádky komentáře. Co tam napíšete, se uloží do /etc/systemd/system/nginx.service.d/override.conf. Například: automaticky znovu spustit nginx, když se nečekaně zastaví.
[Service]
Restart=on-failure
RestartSec=5sPo uložení systemctl edit sám znovu načte konfiguraci systemd. Pokud soubor unit upravujete jiným způsobem, spusťte sami:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload přiměje systemd znovu načíst soubory unit; samotnou službu pak ještě musíte restartovat, aby změnu začala používat. Celkový výsledek (originál plus drop-iny) uvidíte pomocí systemctl cat nginx.
Restart=on-failure je dobrý zvyk pro důležité služby. Neskrývejte tím ale skutečnou chybu: služba, která každých pět sekund spadne a znovu se spustí, si zaslouží prozkoumat v logu. systemd po několika rychlých selháních za sebou přestane službu restartovat (výchozí limit je pět spuštění během deseti sekund) a nastaví ji do stavu failed.
Na AlmaLinuxu a Rocky Linuxu
systemd a systemctl fungují úplně stejně. Liší se jen někdy názvy služeb: služba SSH se jmenuje sshd, webový server z distribuce se jmenuje httpd (Apache) nebo nginx a firewall firewalld.
V praxi
Obrazovka VPS u Vašeho poskytovatele (u WebOké i jinde) umí celý server vypnout, restartovat nebo „vynuceně vypnout“. To poslední je jako vytrhnout zástrčku: služby nedostanou šanci se řádně ukončit a databáze se pak může poškodit. Uvnitř serveru používejte sudo systemctl reboot nebo sudo shutdown -h now a v panelu běžné tlačítko pro vypnutí nebo restart.
Shrnutí
- systemd spouští a hlídá všechny služby; ovládáte jej pomocí
systemctl. systemctl statusukazuje, zda služba běží, zda se spouští při startu systému, a poslední řádky logu.start/stop/restartplatí pro tuto chvíli,enable/disablepro start systému; pro novou službu používejteenable --now.- Po změně konfigurace: nejprve otestovat, pak
reload;systemctl --failedby mělo být prázdné. - Nikdy neupravujte soubor unit z balíčku, použijte drop-in pomocí
systemctl edit.
Kvíz
Úkol
Úkol O6.1: Přehled Vašich služeb. Vytvořte na svém serveru seznam všech běžících služeb (systemctl list-units --type=service --state=running) a zkontrolujte, zda je systemctl --failed prázdné. U každé služby uveďte, co dělá a zda ji potřebujete. U jedné služby, kterou jste neznali, zjistěte, co to je (systemctl status, man). Poté u jedné důležité služby nastavte Restart=on-failure v drop-inu a pomocí systemctl cat ověřte, že tam je.
Úkol O6.1: Přehled Vašich služeb
Tento úkol provádíte sami; nikdo ho nekontroluje. Odškrtněte, co jste udělali, a označte úkol jako splněný.
Drop-in soubor je v /etc/systemd/system/<naam>.service.d/override.conf, ne v /usr/lib/systemd. Při reload služba dál běží a například nginx si při chybě ponechá starou konfiguraci; předem otestujte pomocí nginx -t nebo sshd -t. Nepotřebné služby: disable --now nebo odebrat balíček.
Vaše zaškrtnutí a poznámky zůstávají pouze v tomto prohlížeči; nikam je neposíláme. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol splnili.
Doporučujeme k přečtení
- Manuál
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Manuál
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Manuál
systemd.unit(5)(drop-iny): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
