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.
22. 1. 2021 at 19:08
Jako mě to přijde jako skvělá věc, a rozhodně to využiju. Obecně se mi systém unitů ze systemd líbí. Snad jen u věty „Zároveň využiji journal a mám zadarmo kvalitní log s daty a historií.“ jsem se trochu zarazil. Přeci jenom kvalita implementace je věc, která je systemd dlouhodobě kritizována a logování nejvíc (soukromě jsem se smířil s tím, že na své Fedoře prostě log nemám).
Díky za super článek.
23. 1. 2021 at 14:54
To mě mrzí, že s tím máte problémy. Třeba Vám nějak pomůžeme, neváhejte se zeptat ve fóru.
23. 1. 2021 at 09:17
Nedávno jsem napsal na stejné téma článek „systemd –user u nás“ (https://programatori.travelportgds.cz/systemduser.php). Navíc je tam asi jen jak zařídit, aby služba přežila odhlášení uživatele.
23. 1. 2021 at 14:56
Ten článek je perfektní! Oproti mému spíše wiki zápisku to máte napsané! Díky za odkaz