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