Run a dbus program in crontab , how to know about the SESSION id?
The problem is somewhat similar to accessing the X display and finding the location of the X cookie file. (Also, refer to these questions if you want to launch a GUI program on the user's display.)
Dbus stores the session address in a file in ~/.dbus/session-bus
. The name of the file is $machine_id-$display_number
, where $machine_id
is a randomly generated number stored in /var/lib/dbus/machine-id
and $display_number
is the X display number ($DISPLAY
is :$display_number
or :$display_number.$screen_number
). The file in ~/.dbus/session-bus
is parseable by a shell and contains definitions for DBUS_SESSION_BUS_ADDRESS
and DBUS_SESSION_BUS_PID
.
dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
if [ -e "$dbus_session_file" ]; then
. "$dbus_session_file"
export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
dbus-send …
fi
Beware that there's no guarantee that the dbus daemon is still available. The user may have logged out.
An alternative method is to find the PID of a process in the desktop session, and obtain the dbus address from its environment.
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
If the crontab is running as root and you want to communicate with the session of whatever user is logged in on the console, see Can I launch a graphical program on another user's desktop as root?
I can't comment on Vincenzo's answer, but I find his answer works best for me on KDE4.
I've had to slightly modify the command though. For me it's:
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Notice ADDRESS
in capital letters.
I think if you know the pid of the gnome session manager, then you read the environment from /proc
filesystem.
GNOME_SESSION_PID=<PID_OF_GNOME_SESSION>
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"
Use the SESSION id then, with other programs like notify-send or dbus* tools.
Cheers.