Настройка DISPLAY в служебном файле systemd

9

Я пытаюсь изучить системные сервисы, пытаясь запустить xclock как сервис; файл сервиса ниже

[Unit]
Description=clock

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock

[Install]
WantedBy=graphical.target

Есть идеи, что здесь не так? Я получаю сообщение об ошибке «Не удается подключиться к дисплею».

собаки
источник

Ответы:

18

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

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

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

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

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

Жиль "ТАК - перестань быть злым"
источник
1
Это не проблема с использованием systemctl --user. Также DISPLAYпеременная не имеет значения тогда. Посмотрите здесь .
Suuuehgi
-2

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

xhost si:localuser:$USER

Меня устраивает!

Моника
источник
1
это для служебных файлов systemd, а не .xinitrc
сленг