Estou trabalhando em um script que detectará se e quando uma sessão do Gnome está "bloqueada" por um usuário, a fim de expulsar esse usuário e evitar que pessoas bloqueiem telas em um laboratório de uso público. No entanto, parece que a única maneira de fazer isso é iniciar um monitor dbus da seguinte maneira:
dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
Infelizmente não consigo fazer isso funcionar como root, não importa quantas coisas eu tente. Eu tentei o seguinte:
1
eval `dbus-launch`
dbus-monitor --session ...
Isso falha ao iniciar com o mesmo erro
2
export $(dbus-launch)
dbus-monitor --session ...
Isso é iniciado, mas não monitora as mensagens com êxito.
3
eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...
Isso inicia, mas não monitora as mensagens
O erro exato quando recebo o erro de sessão X11 é o seguinte:
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.
Simplesmente, preciso ser capaz de monitorar as mensagens dbus da sessão org.gnome.ScreenSaver remotamente (de preferência como root, já que configurar um novo usuário pode ser uma dor) e não consigo descobrir como fazer isso. Também deve ser acrescentado que, se eu estiver logado como usuário, posso executar o comando dbus-monitor sozinho, sem problemas (ele registra conforme o esperado).
Mais informações porque não pode doer.
Núcleo: RHEL5
2.6.18-406.el5
Versão DBUS:
D-Bus Message Bus Launcher 1.1.2
Versão do GNOME:
2.16.0
Responder1
O problema é que o dbus-monitor não sabe onde se conectar, pois está sendo executado como um usuário/sessão diferente (root). Você pode obter o ENDEREÇO DBUS do ambiente com 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"
Esses comandos tentam encontrar o processo em execução com pidof -s gnome-session
, então olham para o ambiente e grep para DBUS_SESSION_BUS_ADDRESS e atribuem-no a DBUS_ADDRESS, então usam a variável para informar ao dbus-monitor qual barramento de mensagens monitorar.
Lembre-se de que se você tiver várias sessões só funcionará com a "primeira".