Я работаю над сценарием, который обнаружит, если и когда сессия Gnome будет "заблокирована" пользователем, чтобы ударить того пользователя и предотвратить людей экраны блокировки в общедоступной лаборатории использования. Однако это кажется единственным способом сделать, это должно запустить dbus-монитор следующим образом:
dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
К сожалению, я не могу заставить это работать корнем, неважно, сколько вещей я пробую. Я попробовал следующее:
eval `dbus-launch`
dbus-monitor --session ...
Этому не удается запуститься с той же ошибкой
export $(dbus-launch)
dbus-monitor --session ...
Это запускает, но успешно не контролирует сообщения.
eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...
Это запускает, но не контролирует сообщения
Точная ошибка, когда я действительно получаю ошибку сессии X11, следующие:
Failed to open connection to session message bus: dbus-launch failed to autolaunch D-Bus session: Fd 4 did not have the close-on-exec flag set! Setting the flag.
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified
Autolaunch error: X11 initialization failed.
Так просто я должен смочь контролировать сессию org.gnome. ScreenSaver dbus обменивается сообщениями удаленно (идеально, поскольку корень, начиная с установки нового пользователя может быть боль), и не может выяснить, как сделать это. Нужно также добавить, что, если я вхожусь в систему в качестве пользователя, я могу выполнить dbus-команду-контроля отдельно без любых проблем (это регистрируется как ожидалось).
Больше информации, потому что это не может причинить боль.
Ядро: RHEL5
2.6.18-406.el5
Версия DBUS:
D-Bus Message Bus Launcher 1.1.2
Версия GNOME:
2.16.0
Проблема в том, что dbus-монитор не знает, к кому подключиться, так как работает как другой пользователь/сессия (root). Вы можете получить DBUS ADDRESS из окружения с помощью:
DBUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s gnome-session)/environ)
dbus-monitor --session --address "$DBUS_ADDRESS" "type=signal,interface=org.gnome.ScreenSaver"
Эти команды пытаются найти запущенный процесс с помощью pidof -s gnome-session
, затем посмотреть на окружение и grep для DBUS_SESSION_BUS_ADDRESS и присвоить его DBUS_ADDRESS, затем использовать переменную, чтобы сказать dbus-monitor, какую шину сообщения отслеживать.
Имейте в виду, что если у вас несколько сеансов, то он будет работать только с "первой".
.