Systemd služby pro neprivilegované uživatele

Návod pro administrátory a uživatele

Příprava serveru administrátorem

Ve výchozím nastavení se systemd služby spuštěné pod uživatelem vypnou v momentě odhlášení. Aby mohly běžet nepřetržitě, je potřeba povolit uživateli lingering.

Lingering

loginctl enable-linger <uživatel>

Ověření

Pokud má uživatel povolený lingering, bude se vyskytovat jeho uživatelské jméno v této složce:

ls /var/lib/systemd/linger/

Správa uživatelských služeb

Pro správu uživatelských služeb je nutné využít při

systemctl --machine=<uživatel>@.host --user <příkaz> <název-aplikace>

Dostupné příkazy jsou:

  • start - Pro spuštění služby
  • stop - Pro vypnutí služby
  • status - Pro výpis statusu služby
  • enable - Pro automatické zapnutí služby při startu serveru
  • disable - Vypne automatické zapnutí služby při startu serveru

Vypnutí všech služeb uživatele

Pro vypnutí všech služeb najednou, z jakéhokoliv důvodu lze využít:

loginctl kill-user <uživatel>

Jedná se o kompletní vypnutí všech běžících služeb uživatele, takže uživatel je také odhlášen

Služby které jsou povolené při autostartu to při startu serveru opět zapne

Použití uživatelem

Uživatel má dostupnou vlastní instanci systemd, ale je nutné vždy využít --user přepínače při zapínání

1. Vytvoření adresářové struktury:

Vytvoříme složku, ve které uživatel bude mít vlastní soubory s definovanými službami .service.

mkdir -p ~/.config/systemd/user

2. Vytvoření souboru se službou:

Vytvoříme soubor s příponou .service v nově vytvořeném adresáři. Zvolíme si preferovaný editor (v tomto případě využíváme nano)

nano ~/.config/systemd/user/moje-aplikace.service

Vytvoříme v něm konfiguraci pro naší aplikaci.

Příklad:

[Unit]
# Popis služby
Description=Moje aplikace
# Nastavíme že se služba spustí po startu síťového stacku
After=network.target

[Service]
# Typ služby
Type=simple
# Absolutní cesta k vašemu skriptu nebo aplikaci
ExecStart=/home/<uzivatel>/moje-aplikace/start.sh
# Pokud se aplikace ukončí, systemd ji automaticky restartuje
Restart=on-failure
RestartSec=5

[Install]
# U uživatelských služeb se používá default.target, NIKOLIV multi-user.target!
WantedBy=default.target

Aplikace v ExecStart musí mít práva ke spuštění. Ta lze přidat pomocí:

chmod +x /home/<uzivatel>/moje-aplikace/start.sh

3. Načtení služby do systemd

Kdykoliv vytvoříme novou službu nebo upravíme stávající službu ve složce, je nutné říct systemd aby novou konfiguraci načetl s pomocí příkazu:

systemctl --user daemon-reload

4. Správa služby (Start, Stop, Autostart)

Nyní lze ovládat službu za použití --user přepínače

  • Spuštění služby:

    systemctl --user start moje-aplikace.service
  • Zastavení služby:

    systemctl --user stop moje-aplikace.service
  • Kontrola stavu služby:

    systemctl --user status moje-aplikace.service
  • Restartování služby:

    systemctl --user restart moje-aplikace.service
  • Zapnutí autostartu (služba se spustí po startu serveru):

    systemctl --user enable moje-aplikace.service
  • Vypnutí autostartu:

    systemctl --user disable moje-aplikace.service

Přístup k logům

Veškerý výstup vaší aplikace (standardní výstup i chyby) systemd automaticky zachytává. Pro čtení logů vaší konkrétní služby použijte journalctl s parametrem --user:

# Zobrazení všech logů dané služby
journalctl --user -u moje-aplikace.service

# Sledování logů v reálném čase (podobně jako tail -f)
journalctl --user -u moje-aplikace.service -f

Důležité upozornění: Ujistěte se, že skript nebo soubor definovaný v ExecStart má práva ke spuštění (chmod +x /cesta/k/souboru). Vždy používejte absolutní cesty (např. /home/<uzivatel>/skript.sh, nikoliv ~/skript.sh).