Estoy trabajando en un script que detectará si un usuario "bloquea" una sesión de Gnome y cuándo para expulsarlo y evitar que las personas bloqueen pantallas en un laboratorio de uso público. Sin embargo, parece que la única forma de hacerlo es iniciar un monitor dbus de la siguiente manera:
dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
Desafortunadamente no puedo hacer que esto funcione como root, no importa cuántas cosas intente. He probado lo siguiente:
1
eval `dbus-launch`
dbus-monitor --session ...
Esto no se inicia con el mismo error.
2
export $(dbus-launch)
dbus-monitor --session ...
Esto se inicia pero no monitorea correctamente los mensajes.
3
eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...
Esto se inicia pero no monitorea los mensajes.
El error exacto cuando aparece el error de sesión X11 es el siguiente:
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.
Simplemente, necesito poder monitorear los mensajes dbus de org.gnome.ScreenSaver de la sesión de forma remota (idealmente como root, ya que configurar un nuevo usuario puede ser complicado) y no sé cómo hacerlo. También se debe agregar que si inicio sesión como usuario puedo ejecutar el comando dbus-monitor por sí solo sin ningún problema (se registra como se esperaba).
Más información porque no hace daño.
Núcleo: RHEL5
2.6.18-406.el5
Versión DBUS:
D-Bus Message Bus Launcher 1.1.2
Versión GNOME:
2.16.0
Respuesta1
El problema es que dbus-monitor no sabe a dónde conectarse ya que se ejecuta como un usuario/sesión diferente (root). Puede obtener la DIRECCIÓN DBUS del entorno con algo como:
DBUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s gnome-session)/environ)
dbus-monitor --address "$DBUS_ADDRESS" "type=signal,interface=org.gnome.ScreenSaver"
Esos comandos intentan encontrar el proceso en ejecución pidof -s gnome-session
, luego miran el entorno y buscan DBUS_SESSION_BUS_ADDRESS y lo asignan a DBUS_ADDRESS, luego usan la variable para indicarle a dbus-monitor qué bus de mensajes monitorear.
Ten en cuenta que si tienes varias sesiones solo funcionará con la "primera".