Установка ДИСПЛЕЯ в systemd сервисном файле

rpm --setperms --setguids сбросит полномочия пакетов, Вы указываете, что это может содержать файлы под /var, но файлы в /var/lib/mysql не управляются об/мин. К счастью, они все принадлежат mysql:mysql так сингл chown команда зафиксирует это.

8
16.10.2016, 16:10
3 ответа

Для приложения нужны две вещи открыть окно на X дисплеях. Это должно знать местоположение этих X дисплеев; это передается DISPLAY переменная среды. Это также должно перейти проверку подлинности с X-сервером. Это передается через cookie, который является секретным значением, сгенерированным X-сервером, когда он запускается и сохраненный в файле, к которому только может получить доступ пользователь, который запустил X-сервер. Файл cookie по умолчанию ~/.Xauthority.

Если Ваш X-сервер использует расположение файла cookie по умолчанию, то добавление Environment=XAUTHORITY=/home/dogs/.Xauthority будет работать (принятие /home/dogs корневой каталог пользователя, который зарегистрирован под X). Если необходимо найти местоположение, посмотрите, что я могу запустить графическую программу на рабочем столе другого пользователя как корень? и Откройте окно на удаленном X дисплеев (почему “Не может открыть дисплей”)?

С другой стороны, запуская программу, поскольку пользователь, который выполняет X-сервер, будет работать, при условии, что файл cookie находится в месте по умолчанию (в противном случае, необходимо будет определить местоположение файла cookie, как в корневом случае). Добавьте User директива (например. User=dogs).

Конечно, услуга не будет работать, если не будет X дисплеев тем числом, принадлежавшим пользователю, Вы указываете.

Довольно странно запустить программу GUI от Systemd. Это не было разработано для этого. Программы GUI живут на X сессиях, запущенных пользователем. Systemd для системных процессов. Необходимо экспериментировать с демонами вместо этого.

17
27.01.2020, 20:10

Вы можете добавить в .xinitrc :

xhost si:localuser:$USER

У меня работает!

-2
27.01.2020, 20:10

Современный способ (в 2021 )заключается в том, чтобы не жестко кодировать среду в файле модуля .service. Вместо этого сделайте что-то вроде этого:

$ cat /etc/X11/xinit/xinitrc.d/50-systemd-user.sh
#!/bin/sh

systemctl --user import-environment DISPLAY XAUTHORITY

if command -v dbus-update-activation-environment >/dev/null 2>&1; then
    dbus-update-activation-environment DISPLAY XAUTHORITY
fi

Это то, что делается, например, в Arch Linux.

Объяснение :При запуске X11 обе переменные окружения DISPLAYи XAUTHORITYнаследуются для всех файлов системных юнитов systemd (, т. е. тех, которыми управляетsystemd --user).

Можно проверить, правильно ли они установлены, запустив systemctl --user show-environment.

Таким образом, вам не нужно использовать директивы Environment=в ваших файлах .service.

0
06.06.2021, 17:19

Теги

Похожие вопросы