Isso provavelmente se deve ao fato de que a variável de ambiente DBUS_SESSION_BUS_ADDRESS não é propagada para o ambiente cron.
Pelo menos no Gnome, o ônibus não é "detectável" (conforme documentado na seção "AUTOMATIC LAUNCHING" do dbus-launch(1) man page ) por meio de arquivos em $HOME/.dbus/session-bus . Isso deixa qualquer coisa em execução no seu crontab sem uma maneira de descobrir $DBUS_SESSION_BUS_ADDRESS e entrar em contato com a sessão D-Bus.
Acredito que funcionou no passado, possivelmente devido ao uso de $HOME/.dbus ou a existência de arquivos /tmp/dbus-$TMPNAM referenciados em $DBUS_SESSION_BUS_ADDRESS (que normalmente é definido como algo parecido com unix:abstract=/tmp/dbus-GkJdpPD4sk,guid=0001e69e075e5e2 ). Como a página dbus-cleanup-sockets(1) man explica:
On Linux, this program is essentially useless, because D-Bus defaults to using "abstract sockets" that exist only in memory and don't have a corresponding file in /tmp.
No entanto, podemos usar uma variação da ideia apresentada em um post do ubuntuforum, Anexar à sessão do DBUS existente sobre o SSH , para descobrir a sessão D-Bus de uma sessão de usuário existente na máquina local a partir do ambiente cron e defina $DBUS_SESSION_BUS_ADDRESS de acordo.
Enquanto a técnica usada lá descobre o ambiente de processos comuns como nautilus , pulseaudio e trackerd , e requer que um ou mais deles sejam executados na sessão ativa, eu recomendo uma versão mais básica. abordagem.
Todos os gerenciadores de sessão do ambiente de área de trabalho ( gnome-session , lxsession e kded4 ) têm $DBUS_SESSION_BUS_ADDRESS definido em seu ambiente, mesmo que tenham sido iniciados antes de dbus-daemon e tenham PIDs mais baixos. Então, faz mais sentido usar apenas o gerenciador de sessão correspondente ao seu ambiente de trabalho.
Eu escrevi o seguinte script, colocado em $HOME/bin/test-crontab-dbus.sh , para testar o acesso ao barramento de sessão existente:
#!/bin/sh
SESSION_MANAGER=lxsession
OUTFILE=/tmp/${USER}-cron-dbus.txt
export $(cat /proc/$(pgrep "$SESSION_MANAGER" -u "$USER")/environ \
|egrep -z '^DBUS_SESSION_BUS_ADDRESS=')
date >> $OUTFILE
dbus-send --session --dest=org.freedesktop.DBus \
/ org.freedesktop.DBus.GetId 2>> $OUTFILE
if test "$?" -eq 0; then
echo "Success contacting session bus!" >> $OUTFILE
fi
O SESSION_MANAGER=lxsession acima é apropriado para uma sessão da área de trabalho principal em execução no LXDE. No Gnome, você definiria SESSION_MANAGER=gnome-session e, no KDE, usaria SESSION_MANAGER=kded4 .
Se o trabalho no crontab tiver acesso ao barramento da sessão, você verá algo como o seguinte na saída:
Fri Dec 18 15:27:02 EST 2015
Success contacting session bus!
Caso contrário, você verá a saída da mensagem de erro por dbus-send .
Obviamente, você pode substituir qualquer outro método de teste de conectividade ao barramento de sessão, incluindo qualquer operação que você realmente precise executar por meio de uma tarefa cron.