+++ title = "Servis v systemd" description = "Jak vyrobit z binárky systemd daemona" date = 2021-02-04 draft = false slug = "systemd-service" [taxonomies] categories = ["linux"] tags = ["systemd", "administrace"] +++ Pokud potřebujeme spouštět program jako službu, na distribucích se systemd musíme vytvořit konfigurační soubor s popisem služby. Výhoda je, že lze jako daemona použít i normální binárka, kde se neřeší daemonizace forkem. Konfigurák vytvoříme v `/etc/systmd/system/foo-daemon.service` s obsahem: ``` [Unit] Description=Foo [Service] ExecStart=/usr/sbin/foo-daemon [Install] WantedBy=multi-user.target ``` Až je to hotové, je potřeba přenačíst služby příkazem: ``` $ sudo systemctl daemon-reload ``` Pak se dá služba ovládat přes systemctl: ``` $ sudo systemctl start foo-daemon $ sudo systemctl stop foo-daemon $ sudo systemctl restart foo-daemon $ systemctl status foo-daemon ``` A vypsat log přes journalctl: ``` $ journalctl -u foo-daemon ``` ## Sekce konfiguráku ### `[Unit]` - popis služby |Parametr |Popis | |-------------|--------------------------------------------------------------------------------------------------------------------------------| |Description |Krátký popis služby | |Documentation|Seznam URI odkazů na dokumentaci | |Before, After|Pořadí startu služeb | |Requires |Pokud bude aktivována tato služba, aktivují se i služby v tomto seznamu | |Wants |Slabší závislosti, než v parametru Requires. Pokud se nezdaří start některé služby z tohoto seznamu, služba se přesto nastartuje| |Conflicts |Seznam konfliktních služeb |   ### `[Unit]` - konfigurace instalace |Parametr |Popis | |--------------------|----------------------------------------------------------------------------------------------------------------| |Alias |Alias služby | |RequiredBy, WantedBy|Služba nastartuje, pokud budou nastartovány všechny služby z tohoto seznamu. Viz Requires a Wants v sekci Unit | |Also |Seznam služeb, které budou povoleny nebo zakázány zároveň s touto službou (systemctl enable, systemctl disable)|   ### `[Service]` - konfigurace startu |Parametr |Popis | |---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |Type |Způsob spouštění služby | | | simple (výchozí)- spustit, jak je definováno v parametru ExecStart | | | forking- služba je spuštěná, až dojde k forku a skončí rodičovský proces | | | oneshot - podobné jako simple, ale předpokládá se, že proces skončí než se budou startovat následující služby. Lze definovat RemainAfterExit=yes, pak se předpokládá, že je služba aktivní, i když proces už skončil | | | dbus- podobné jako simple, ale služba se považuje za spuštěnou, až dostane D-Bus jméno | | | notify- podobné jako simple, ale služba se považuje za spuštěnou, až pošle signál systemd | | | idle- spuštění služby je odloženo až doběhnou všechny úlohy| |ExecStart |Příkaz i s argumenty pro spuštění služby. | |ExecStop |Příkaz pro zastavení služby | |ExecReload |Příkaz pro přenačtení konfigurace | |Restart |Pokud je zadán tento parametr, služba je restartována v případě, že se ukončí nebo spadne. Při ukončení přes systemctl stop k restartu nedojde | |RemainAfterExit|Pokud je nastaveno na True, služba je považována za spuštěnou, i když skončí proces |   ## Přiklady konfigurace ``` [Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target ``` ``` [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target [Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target ``` ``` [Unit] Description=Redis persistent key-value database After=network.target [Service] ExecStart=/usr/bin/redis-server /etc/redis.conf --daemonize no ExecStop=/usr/bin/redis-shutdown User=redis Group=redis [Install] WantedBy=multi-user.target ```