# systemd ## Пользовательский сервис с доступом к 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` будет автоматически запускаться после входа пользователя в систему.