Execute um programa dbus no crontab, como saber sobre o ID da SESSÃO?

17

Eu preciso executar algum programa dentro do crontab, mas como o programa pode saber sobre o id da sessão dbus? está disponível somente para programas lançados pelos gerenciadores de sessão.

    
por daisy 06.01.2012 / 16:32

4 respostas

21

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?

    
por 07.01.2012 / 02:25
2

Eu acho que se você conhece o pid do gerenciador de sessão do gnome, então você lê o ambiente do sistema de arquivos /proc .

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 de SESSÃO e, em seguida, com outros programas como o notify-send ou o dbus *.

Felicidades.

    
por 06.01.2012 / 17:27
1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
    
por 17.06.2014 / 15:32
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. Para mim é:

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

Observe ADDRESS em letras maiúsculas.

    
por 22.04.2016 / 11:53

Tags