# systemd

## Управление сервисом

Если файл сервиса был изменен - для применения изменений необходимо перечитать файлы сервисов:

```sh
systemctl daemon-reload
```

## Пользовательский сервис с доступом к X11

Для запуска пользовательских сервисов необходимо импортировать данные в переменную `XDG_RUNTIME_DIR`. Это можно сделать путём определения переменной в файле, который передаётся на запуск `startx` или `xinit` (например файл `~/.xinitrc`)::

```sh
export XDG_RUNTIME_DIR=/run/user/$(id -u)
```

### Пример пользовательского сервиса

Структура сервиса в качестве примера:

```sh
.
├── bin
│   └── myprogram
└── etc
    └── systemd
        └── user
            └── myprogram.service
```

где `bin/myprogram` - исполняемый файл самой программы, которую необходимо запускать в качестве пользовательского сервиса `systemd`. Файл `/etc/systemd/user/myprogram.service`:

```sh
[Unit]
Description=myprogram
PartOf=graphical-session.target

[Service]
ExecStart=/bin/myprogram

[Install]
WantedBy=default.target
```

Для автозагрузки сервиса необходимо создать ссылку на сам сервис в домашней директории `~/.config/systemd/user/graphical-session.target.wants/myprogram.service`:

```sh
.config
└── systemd
    └── user
        └── graphical-session.target.wants
            └── myprogram.service -> /etc/systemd/user/myprogram.service
```

Делается это командой:

```sh
systemctl --user enable myprogram.service
```

Так как сервис запускается **после** входа пользователя в систему, то необходимо в файл, который передаётся на запуск `startx` или `xinit` добавить строку запсука `myprogram.service` (например, в файл `~/.xinitrc`):

```sh
systemctl --user start myprogram.service
```

После чего сервис `myprogram.service` будет автоматически запускаться после входа пользователя в систему.

### Пример пользовательского сервиса с использованием "якоря" `xsession.target`

Структура сервиса в качестве примера:

```sh
.
├── bin
│   └── myprogram
└── etc
    └── systemd
        └── user
            ├── myprogram.service
            └── xsession.target
```

где `bin/myprogram` - исполняемый файл самой программы, которую необходимо запускать в качестве пользовательского сервиса `systemd`. Файл `/etc/systemd/user/myprogram.service`:

```sh
[Unit]
Description=myprogram
PartOf=graphical-session.target

[Service]
ExecStart=/bin/myprogram

[Install]
WantedBy=xsession.target
```

Файл `/etc/systemd/user/xsession.target` используемый в качестве "якоря", на который будут цепляться остальные сервисы:

```sh
[Unit]
Description=X session managed by systemd
BindsTo=graphical-session.target
```

Для автозагрузки сервиса необходимо создать ссылку на сам сервис в домашней директории `~/.config/systemd/user/graphical-session.target.wants/myprogram.service`:

```sh
.config
└── systemd
    └── user
        └── graphical-session.target.wants
            └── myprogram.service -> /etc/systemd/user/myprogram.service
```

Делается это командой:

```sh
systemctl --user enable myprogram.service
```

Так как сервис запускается **после** входа пользователя в систему, то необходимо в файл, который передаётся на запуск `startx` или `xinit` добавить строку запсука "якоря" `xsession.target` (например, в файл `~/.xinitrc`):

```sh
systemctl --no-block --user start xsession.target
```

После чего сервис `myprogram.service` будет автоматически запускаться после входа пользователя в систему.

## Просмотр журнала

```sh
journalctl -b -u docker
```

где 

- `-b` - показать сообщения с момента последней (текущей) загрузки системы
- `-u` - показать журнал с указанного сервиса (`docker`)

## [Анализ производительности загрузки системы](https://www.commandlinux.com/man-page/man1/systemd-analyze.1.html)

Вывести SVG-графику с подробным описанием того, какие системные службы были запущены в какое время, выделяя время, затраченное ими на инициализацию:

```sh
systemd-analyze plot > boot.svg
```

## Параметры сервиса

Чтобы [перед запуском службы](https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=) выполнить какой либо процесс, необходимо указать `ExecStartPre`. Например, чтобы обеспечить задержку перед запуском службы необходимо добавить:

```sh
[Service]
ExecStartPre=/bin/sleep 30
```
