You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
13 KiB
Markdown
140 lines
13 KiB
Markdown
+++
|
|
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
|
|
``` |