Systemd je váš správce procesů, který řídí všechny ostatní programy ve vašem systému. Nejčastěji se s ním setkáváte, pokud chcete ovládat různé služby jako servery, interní nástroje systému, apod. Tak systemd pomáhá řídit i celé vaše uživatelské sezení. Tuto integraci můžeme zapojit pro vývojová prostředí, která se mohou automaticky spustit přímo po přihlášení, získáte pro ně centrální správu a ukládání záznamů, ve kterých můžete snadno vyhledávat.

Systemd

Pokud náhodou systemd neznáte, jde o správce procesů a první proces systému, který se spustí (má číslo procesu 1). Spouští a spravuje další služby (procesy), včetně grafických prostředí. Služby můžete spouštět, zastavovat, restartovat, jak je libo. Součástí systemd rodiny je i několik dalších projektů, například centrální logovací služba (journal), aj. Systemd ovládá všechny procesy spuštěné ve vašem systému, takže se stará třeba i o aplikace ve Vašem profilu. Sami se podívejte, co zrovna běží s vaším účtem systemctl --user status, (bez přepínače --user uvidíte všechny systémové procesy). A já bych rád, aby takto bylo zapojené i moje vývojové prostředí, třeba proto, abych status, jestli běží, mohl kontrolovat stejně jako ostatní systémové prostředky.

Současný stav

Aplikace, kterou vytvářím, se skládá z backendu (v mém případě Python + Django) a frontendu, který je psaný v Reactu. Moje běžné workflow tak je pustit backend (vybrat virtuální prostředí Pythonu a spustit manage.py runserver a vedle něho v terminálu frontend (vstoupit do složky s projektem a npm start)). Obě prostředí se automaticky při změně zdrojového souboru na disku restartují a překládají. Celý proces vyžaduje řadu příkazů a musí být ovládán z konkrétního umístění. To chceme změnit. Až projdete tento tutoriál, můžete jedním příkazem přes systemd pustit obě nezávislé komponenty najednou a případně je dokonce můžete automaticky spouštět při startu sezení uživatele.

Kam s nimi?

Mně se líbí umístění v ~/.config/systemd/user/, kam můžu své vlastní definice služeb nahrávat. Tato složka u vás pravděpodobobně neexistuje, tak si ji založte.

mkdir -p ~/.config/systemd/user/

Struktura takových souborů není vůbec složitá. A pro začátek nám bude stačit pouze pár direktiv. Syntaxí jde o ini soubory (vlastnost=hodnota) rozšířené o sekce (zapisované v hranatých závorkách)

[Unit]
Description=Backend server

[Service]
ExecStart=/home/ondrej/backend/venv/bin/python /home/ondrej-backend/manage.py runserver

[Install]
WantedBy=default.target

Pro frontend by to bylo taky velmi jednoduché nebýt toho, že celý server se ukončuje při nalezení EOF na konci standardního vstupu. Samozřejmě v případě neinteraktivního sezení to je hned. Dostal jsem nápad, že bych mu mohl předat jako standardní vstup nějaký nekončící soubor (jak hloupý nápad). Stále opakované čtení z /dev/zero vedlo ke skokovému nárůstu využití CPU. Naštěstí jsem poté objevil proměnnou (jak jinak než na StackOverflow, kde původní rada navrhovala měnit knihovny), která zabraňuje tomuto nežádoucímu chování a toto zbytečné čtení ze souboru jsem mohl smazat.

[Unit]
Description=Project

[Service]
ExecStart=/usr/bin/npm run start --prefix /home/ondrej/project
Environment=CI=true

[Install]
WantedBy=default.target

Nezapomeňte systemd nechat znovunačíst konfiguraci s systemctl --user daemon-reload. Za specifických podmínek může některá ze služeb skončit (špatný import v Reactu, kdy se nepodaří překlad a nebo třeba nevhodná úprava projektu v Djangu), proto můžete využít klauzuli Restart.

Co z toho mám?

Teď můžu ovládat svoje projekty přes systemctl --user a je velmi snadné je startovat při otevření uživatelského sezení. Zároveň využiji journal a mám zadarmo kvalitní log s daty a historií. Prostě paráda.

# Spustit backend/frontend
systemctl --user start backend
systemctl --user start frontend
# Ukončení jedné ze služeb
systemctl --user stop backend
# Podívat se na záznamy toho backendu (-u jednotka a -f chci číst všechny nově příchozí záznamy)
journalctl --user -uf backend
# Povolit spouštění obou služeb při přihlášení
systemctl --user enable backend frontend

Závěr

Integrovat svoje služby se systemd není vůbec špatný nápad, s malými náklady získáte pohodlnou kontrolu, centrální správu atd. dokonce i v uživatelském sezení. Ukázali jsme si, jak vytvořit .service soubor, kam ho umístit. Také už víme, jak ho ovládat a kde hledat logy. Pokud vás napadne nějaká otázka, či doplnění, podělte se s námi v komentářích.