O problema é um pouco semelhante a acessando a exibição X e achando a localização do arquivo de cookie X . (Além disso, consulte estas perguntas se quiser iniciar um programa GUI na tela do usuário.)
O Dbus armazena o endereço da sessão em um arquivo em ~/.dbus/session-bus
. O nome do arquivo é $machine_id-$display_number
, em que $machine_id
é um número gerado aleatoriamente armazenado em /var/lib/dbus/machine-id
e $display_number
é o número de exibição X ( $DISPLAY
é :$display_number
ou :$display_number.$screen_number
). O arquivo em ~/.dbus/session-bus
é analisável por um shell e contém definições para DBUS_SESSION_BUS_ADDRESS
e 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
Tome cuidado, pois não há garantia de que o daemon dbus ainda esteja disponível. O usuário pode ter efetuado logout.
Um método alternativo é encontrar o PID de um processo na sessão da área de trabalho e obter o endereço dbus de seu ambiente.
export $(</proc/$pid/environ tr \0 \n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
Se o crontab estiver sendo executado como root e você quiser se comunicar com a sessão de qualquer usuário que tenha efetuado login no console, consulte Posso lançar um programa gráfico na área de trabalho de outro usuário como root?