Execute um programa dbus no crontab, como saber sobre o id da sessão?

17

Preciso executar algum programa no crontab, mas como o programa pode saber sobre o ID da sessão do dbus? está disponível apenas para programas iniciados por gerenciadores de sessões.

margarida
fonte

Respostas:

21

O problema é um pouco semelhante ao acessar a exibição X e encontrar a localização do arquivo de cookie X . (Além disso, consulte estas perguntas se desejar iniciar um programa GUI na tela do usuário.)

O Dbus armazena o endereço da sessão em um arquivo ~/.dbus/session-bus. O nome do arquivo é $machine_id-$display_number, onde $machine_idé um número gerado aleatoriamente armazenado /var/lib/dbus/machine-ide $display_numberé o número de exibição X ( $DISPLAYé :$display_numberou :$display_number.$screen_number). O arquivo in ~/.dbus/session-busé analisável por um shell e contém definições para DBUS_SESSION_BUS_ADDRESSe 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

Cuidado que não há garantia de que o daemon dbus ainda esteja disponível. O usuário pode ter desconectado.

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 em execução como root e você desejar se comunicar com a sessão de qualquer usuário conectado no console, consulte Posso iniciar um programa gráfico na área de trabalho de outro usuário como root?

Gilles 'SO- parar de ser mau'
fonte
2

Eu acho que se você conhece o pid do gerenciador de sessões do gnome, então você lê o ambiente no /procsistema de arquivos.

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 o ID da SESSÃO então, com outros programas, como as ferramentas de notificação de envio ou dbus *.

Felicidades.

Nikhil Mulley
fonte
muito impressionante, na verdade estou executando o KDE4, então procurei plasma-desktop, obrigado!
David margarida
1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Vincenzo
fonte
1

Não posso comentar a resposta de Vincenzo , mas acho que a resposta dele funciona melhor para mim no KDE4.

Eu tive que modificar um pouco o comando embora. Para mim é:

ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

Aviso ADDRESSem maiúsculas.

noric
fonte
0

Sim, o DBus deve ter uma sessão de machado. Como respostas anteriores, 'DBUS_SESSION_BUS_ADDRESS' deve ter um valor antes de iniciar. No entanto, você pode usar o 'dbus-launch' para criar esse valor. O snippet a seguir pode ser inserido em um script chamado from crontab.

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
  eval `dbus-launch --sh-syntax`
fi
echo "D-Bus daemon address is:"
echo "$DBUS_SESSION_BUS_ADDRESS"

# -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
sudo -u <user> -E <program> 

Um contratempo com esta solução é que a sessão pode demorar após você interromper o software.

karnbo
fonte