rpm --setperms --setguids
сбросит полномочия пакетов, Вы указываете, что это может содержать файлы под /var
, но файлы в /var/lib/mysql
не управляются об/мин. К счастью, они все принадлежат mysql:mysql
так сингл chown
команда зафиксирует это.
Для приложения нужны две вещи открыть окно на 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 для системных процессов. Необходимо экспериментировать с демонами вместо этого.
Вы можете добавить в .xinitrc
:
xhost si:localuser:$USER
У меня работает!
Современный способ (в 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
.