19

I'm trying to run D-Bus on an embedded system (Yocto Linux) and connect to it from my application code.

I get the following error when I call dbus_bus_get(DBUS_BUS_SESSION, &err);

Using X11 for dbus-daemon autolaunch was disabled 
at compile time, set your DBUS_SESSION_BUS_ADDRESS 
instead

I realize that I need to start the dbus-daemon first so I have run dbus-launch from the command line.

This prints out a value of DBUS_SESSION_BUS_ADDRESS but how could I export it programmatically?

6 Answers 6

41

I've finally found the answer, running the following command exports the output of dbus-launch:

export $(dbus-launch)
Sign up to request clarification or add additional context in comments.

6 Comments

This starts a new dbus-daemon process. Is that desirable?
I probably is in a "embedded" system, where you have to explicitly start everything in order to preserve resources.
This seems to be X11 specific, does not work on Wayland.
@DavidL. You can try export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus. It works for me. (I tried in cron, it seems to not know $XDG_RUNTIME_DIR).
IMHO, it is better to use the currently running dbus's DBUS_SESSION_BUS_ADDRESS. See this QA answer for how to find that.
|
11
pid_gnome=$(pgrep gnome-session)
DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/${pid_gnome}/environ|cut -d= -f2-)
export DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS}

Please make sure that the user has the DISPLAY variable set.

Another alternative is:

export $(dbus-launch)

2 Comments

pgrep gnome-session may output multiple PIDs (e.g. three processes on Ubuntu 20.04), so it should be pgrep gnome-session | head -1. DBUS_SESSION_BUS_ADDRESS=$(grep ... | cut -d= -f2-) ends with 000a (\0\n), which causes warning bash: warning: command substitution: ignored null byte in input when export. So it should be DBUS_SESSION_BUS_ADDRESS=$(grep ... | cut -d= -f2- | tr -d '\0\n').
WIth grep -P, | cut is not needed. export DBUS_SESSION_BUS_ADDRESS=$(grep -P -o -a "(?<=DBUS_SESSION_BUS_ADDRESS=).+?(?=\x00)" /proc/"$(pgrep gnome-session | head -1)"/environ)
8

Type the following command into a terminal:

eval `dbus-launch --auto-syntax`

3 Comments

Thank you for this code snippet, which might provide some limited, immediate help. A proper explanation would greatly improve its long-term value by showing why this is a good solution to the problem and would make it more useful to future readers with other, similar questions. Please edit your answer to add some explanation, including the assumptions you’ve made.
Please fix your backslash. I cannot because it would not be enough characters to allow a change.
This is not good ans. After doing this, I cant use RDP.
2

When you launch your user session, do it like this:

dbus-daemon --session --fork --print-address 1 > /tmp/dbus-session-addr.txt

This will cause the session address to be written to /tmp/dbus-session-addr.txt. (The filename's not that important, it's just somewhere you've decided to store it.)

Then, when you need the variable set:

export DBUS_SESSION_BUS_ADDRESS=$(cat /tmp/dbus-session-addr.txt)

If your shell's sniffy about export-during-definition - some can be - do it in two stages:

DBUS_SESSION_BUS_ADDRESS=$(cat /tmp/dbus-session-addr.txt)
export DBUS_SESSION_BUS_ADDRESS

Comments

1

It sounds like you are trying to get the value of DBUS_SESSION_BUS_ADDRESS in order for your application to run correctly. Try running it with dbus-run-session instead of dbus-launch. According to https://dbus.freedesktop.org/doc/dbus-launch.1.html dbus-launch should not be run from the command line, but in a shell script (see also https://dbus.freedesktop.org/doc/dbus-run-session.1.html).

Comments

-7

Type in terminal:

export $DBUS_SESSION_BUS_ADDRESS

2 Comments

If the variable is not set, exporting it will not solve anything, thus $(dbus-launch) solves this issue.
This is worse than wrong as it will try to export a variable named after the contents of DBUS_SESSION_BUS_ADDRESS which makes no sense.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.