LINUX.ORG.RU

xhost и демон

 , , ,


0

1

есть демон, пуcкается от рута, который дергает XOpenDisplay(":0.0").

на что получает ошибку «No protocol specified»

однако, опция lightdm.conf

display-setup-script=/usr/bin/xhost +local:

решает проблему.

вопрос, а можно ли вкрутить и запуск xhost в системд? и как это сделать? чтобы не привязываться к конкретному DM.

ну или еще как-то скостылить, но так, чтобы после загрузки, но без логина юзера в систему, срабатывал xhost и демон не ругался.

★★★
Ответ на: комментарий от dexpl
[Unit]
Description=daemon service
After=display-manager.service

[Service]
Type=forking
PIDFile=/var/run/mydaemon.pid
ExecStartPre=/usr/bin/xhost +local:
ExecStart=/usr/bin/mydaemon
[Install]
WantedBy=multi-user.target

такое при старте говорит:

Process: 1547 ExecStartPre=/usr/bin/xhost +local: (code=exited, status=1/FAILURE)

/usr/bin/xhost: unable to open display «»

conalex ★★★
() автор топика
Последнее исправление: conalex (всего исправлений: 1)
Ответ на: комментарий от conalex

Попробуй прописать ExecStartPre=/usr/bin/xhost +local: в /etc/systemd/system/display-manager.service.d/override.conf и сказать systemctl daemon-reload. К слову, в WantedBy=multi-user.target я бы заменил multi-user на graphical.

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

попробовал. перестал запускаться lightdm.

systemctl status lightdm.service
● lightdm.service - Light Display Manager
   Loaded: loaded (/lib/systemd/system/lightdm.service; indirect; vendor preset: enabled)
  Drop-In: /etc/systemd/system/lightdm.service.d
           └─override.conf
   Active: failed (Result: exit-code) since Fri 2018-09-21 22:51:59 MSK; 5s ago
     Docs: man:lightdm(1)
  Process: 1628 ExecStartPre=/usr/bin/xhost +local: (code=exited, status=1/FAILURE)
  Process: 1626 ExecStartPre=/bin/sh -c [ "$(cat /etc/X11/default-display-manager 2>/dev/null)" = "/usr/sbin/lightdm" ] (code=exited, status=0/SUCCESS)
 Main PID: 1394 (code=exited, status=0/SUCCESS)

Sep 21 22:51:59 rig systemd[1]: lightdm.service: Failed with result 'exit-code'.
Sep 21 22:51:59 rig systemd[1]: Failed to start Light Display Manager.
Sep 21 22:51:59 rig systemd[1]: lightdm.service: Service RestartSec=100ms expired, scheduling restart.
Sep 21 22:51:59 rig systemd[1]: lightdm.service: Scheduled restart job, restart counter is at 5.
Sep 21 22:51:59 rig systemd[1]: Stopped Light Display Manager.
Sep 21 22:51:59 rig systemd[1]: lightdm.service: Start request repeated too quickly.
Sep 21 22:51:59 rig systemd[1]: lightdm.service: Failed with result 'exit-code'.
Sep 21 22:51:59 rig systemd[1]: Failed to start Light Display Manager.
Sep 21 22:51:59 rig systemd[1]: lightdm.service: Triggering OnFailure= dependencies.
Sep 21 22:51:59 rig systemd[1]: lightdm.service: Failed to enqueue OnFailure= job, ignoring: Unit plymouth-quit.service not found.
conalex ★★★
() автор топика

судя по тому, что xhost дергает все тот же XOpenDisplay() (внезапно), неудивительно что оно не взлетает.

вопрос можно поставить иначе: как указать валидные DISPALY XAUTHORITY для системного демона, запущенного от рута? т.е. как можно обойтись без xhost?

cast intelfx

conalex ★★★
() автор топика

есть демон, пуcкается от рута, который дергает XOpenDisplay(":0.0")

На этом месте уже всё неправильно. Как ты собрался синхронизировать своего демона относительно запуска X-сервера?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

пока это выходит путем некоторого ожидания: с интервалом вызывается XOpenDispaly() несколько раз.

а как правильно-то?

conalex ★★★
() автор топика
Ответ на: комментарий от intelfx

т.е. прописать вызов xhost в профиль /etc/profile?

systemctl --user import-environment тут никак не в тему? а напрямую в файле сервиса указать переменные окружения - тоже не вариант?

потом, непонятно, ну будет автологин, окей. как это поможет демону синхронизироваться с Х-сервером?

conalex ★★★
() автор топика
Последнее исправление: conalex (всего исправлений: 3)
Ответ на: комментарий от conalex

т.е. прописать вызов xhost в профиль /etc/profile?

Т. е. не городить велосипедов и запускать своё приложение из ~/.Xsession.

Либо пихать в юнит всё от начала и до конца — создание сессии, запуск X-сервера, запуск приложения. Это если у тебя киоск какой-то там.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

создание сессии, запуск X-сервера

это работа DM. ligthdm, например, справляется с этим на ура.

не городить велосипедов

см. выше.

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

хотелось бы стартовать сервис без привязки к конкретному DM и к логину юзера в систему. и да, это не киоск.

conalex ★★★
() автор топика
Последнее исправление: conalex (всего исправлений: 1)
Ответ на: комментарий от conalex

что можно выжать именно из системд

В целом ничего. Можешь сделать точно так же, как со своим демоном: запускать xhost в цикле, пока не сработает. А вообще — systemd не предназначен для запуска программ в пользовательских сессиях. Ты с таким подходом будешь ловить все сорта глюков и сложностей.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.