I am working on a script that will detect if and when a Gnome session is "locked" by a user in order to kick that user and prevent people locking screens in a public use lab. However, it seems the only way to do this is to launch a dbus-monitor as follows:

dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"

Unfortunately I can't get this to work as root, no matter how many things I try. I have tried the following:


eval `dbus-launch`
dbus-monitor --session ...

This fails to launch with the same error


export $(dbus-launch)
dbus-monitor --session ...

This launches but doesn't successfully monitor the messages.


eval `dbus-launch`
dbus-monitor --session ...

This launches but doesn't monitor the messages

The exact error when I do get the X11 session error is as follows:

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.

So simply, I need to be able to monitor the session org.gnome.ScreenSaver dbus messages remotely (ideally as root, since setting up a new user can be a pain) and can't figure out how to do that. It should also be added that if I'm logged in as a user I can run the dbus-monitor command by itself without any problems (it logs as expected).

More info because it can't hurt.

Kernel: RHEL5


DBUS Version:

D-Bus Message Bus Launcher 1.1.2

GNOME Version:


1 Answer 1


The problem is that dbus-monitor doesn't know where to connect to as it's running as a different user/session (root). You can get the DBUS ADDRESS from the environment with something like:

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"

Those commands try to find the running process with pidof -s gnome-session, then look at the environment and grep for the DBUS_SESSION_BUS_ADDRESS and assign it to DBUS_ADDRESS, then uses the variable to tell dbus-monitor what message bus to monitor.

Keep in mind that if you have multiple sessions it will only work with the "first".

  • I'll try this monday and let you know if it works, but that seems about right to me. Thanks.
    – Merglyn
    Jun 19, 2015 at 20:42
  • Our version of DBUS doesn't have the --address option, so I exported the result instead, and got the following error: Failed to open connection to session message bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken. I was running as root. Any ideas?
    – Merglyn
    Jun 23, 2015 at 15:14
  • Should add that there only is one session open when I run pidof gnome-session without -s, so it's the right one.
    – Merglyn
    Jun 23, 2015 at 15:18
  • If you know the user you could use one quick and dirty trick, use sudo as the user: sudo -u *username* -E dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver"(the -E option to preserve the environment so dbus-monitor can access the exported DBUS_ADDRESS. If that doesn't work you may want to add <allow user="*"/>to the <policy context="default"> in the session.conf file for DBUS (in Fedora is in /etc/dbus-1/session.conf.I hope something of that works. Jun 23, 2015 at 16:06

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .