Я работаю над сценарием, который будет определять, заблокирован ли сеанс Gnome пользователем и когда он заблокирован, чтобы исключить этого пользователя и предотвратить блокировку экранов в лаборатории общего пользования. Однако, похоже, единственный способ сделать это - запустить dbus-monitor следующим образом:
dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
К сожалению, я не могу заставить это работать как root, сколько бы я ни пытался. Я пробовал следующее:
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 (в идеале с правами root, поскольку настройка нового пользователя может быть проблемой) и я не могу понять, как это сделать. Также следует добавить, что если я вошел в систему как пользователь, я могу без проблем запустить команду dbus-monitor (она регистрируется, как и ожидалось).
Больше информации, потому что это не повредит.
Ядро: RHEL5
2.6.18-406.el5
Версия DBUS:
D-Bus Message Bus Launcher 1.1.2
Версия GNOME:
2.16.0
Проблема в том, что dbus-monitor не знает, куда подключиться, поскольку он работает от имени другого пользователя / сеанса (root). Вы можете получить АДРЕС DBUS из среды примерно так:
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, какую шину сообщений отслеживать.
Имейте в виду, что если у вас несколько сеансов, он будет работать только с «первым».