V systemd 230 byla zavedena novinka a to zabití uživatelských procesů po odhlášení uživatele. Tzn. veškeré procesy, i ty, které byly spuštěny pomocí klasického příkazu nohup, byly killnuty. Toto chování lze nastavit KillUserProcesses= v souboru /etc/systemd/logind.conf. Výchozí nastavení je yes, ovšem některé distibuce jej překlápějí na no už během kompilace.

Já jsem hledal způsob, jak spouštět uživatelské služby na pozadí “the systemd way”. Způsobů je víc (například i přes systemd-run), v tomto článku se budu zabývat uživatelskými službami.

Nutné balíčky

Alespoň tedy v Debian testing:

  • libpam-systemd

a nastavení

Jako uživatel root:

loginctl enable-linger tomas

Toto nastavení pro konkrétního uživatele vypne volbu (KillUserProcesses). Uživatelské služby lze používat i bez aktivního linger, ale po jeho odhlášení se všechny ukončí.

Uživatelské služby

S uživatelskými službami se pracuje vlastně úplně stejně, jako se systémovými, akorát příkazu systemctl přidáme parametr --user.

Takže jako příklad si vytvoříme unitu, která při prvním přihlášení uživatele spustí tmux session, do které se potom uživatel může přihlášit. A při jeho odhlášení tmux bude běžet stále na pozadí (v tomto případě je nutné pro uživatele zapnout linger).

Unita pro start tmux může vypadat nějak takto. Soubor ~/.config/systemd/user/tmux.service:

[Unit]
Description=Start tmux in detached session

[Service]
Type=forking
ExecStart=/usr/bin/tmux new-session -s tomas -d
ExecStop=/usr/bin/tmux kill-session -t tomas

[Install]
WantedBy=default.target

Service chceme aktivovat po loginu:

systemctl --user enable tmux

pochopitelně ji můžeme spusti nebo vypnout i ručně:

systemctl --user start tmux

Pracuje se s tím tedy úplně stejně, jako na systémové úrovni, jen je tady navíc parametr --user.

Tímto způsobem si můžete do svého uživatelského systemd přidat další služby, definovat timery pro uživatelské skripty apod.