+++
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                                                                                                      |
&nbsp;

### `[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)|
&nbsp;

### `[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                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
&nbsp;

## 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
```