Ejecute un programa dbus en crontab, ¿cómo saber acerca de la identificación de la sesión?

17

Necesito ejecutar algún programa dentro de crontab, pero ¿cómo puede saber el programa acerca de la identificación de sesión dbus? solo está disponible para programas lanzados por administradores de sesión.

margarita
fuente

Respuestas:

21

El problema es algo similar a acceder a la pantalla X y encontrar la ubicación del archivo X cookie . (Además, consulte estas preguntas si desea iniciar un programa GUI en la pantalla del usuario).

Dbus almacena la dirección de la sesión en un archivo ~/.dbus/session-bus. El nombre del archivo es $machine_id-$display_number, donde $machine_ides un número generado aleatoriamente almacenado /var/lib/dbus/machine-idy $display_numberes el número de visualización X ( $DISPLAYes :$display_numbero :$display_number.$screen_number). El archivo ~/.dbus/session-buses analizable por un shell y contiene definiciones para DBUS_SESSION_BUS_ADDRESSy 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

Tenga en cuenta que no hay garantía de que el dbus daemon todavía esté disponible. El usuario puede haber cerrado sesión.

Un método alternativo es encontrar el PID de un proceso en la sesión de escritorio y obtener la dirección dbus de su entorno.

export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')

Si el crontab se está ejecutando como root y desea comunicarse con la sesión de cualquier usuario que haya iniciado sesión en la consola, consulte ¿Puedo iniciar un programa gráfico en el escritorio de otro usuario como root?

Gilles 'SO- deja de ser malvado'
fuente
2

Creo que si conoces el pid del administrador de sesión de gnome, entonces lees el entorno del /procsistema de archivos.

GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"

Utilice la identificación de SESIÓN entonces, con otros programas como notificar-enviar o herramientas dbus *.

Salud.

Nikhil Mulley
fuente
muy impresionante, en realidad estoy ejecutando KDE4, así que busqué en su plasma-desktoplugar, ¡gracias!
Margarita
1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Vincenzo
fuente
1

No puedo comentar sobre la respuesta de Vincenzo , pero creo que su respuesta funciona mejor para mí en KDE4.

Sin embargo, he tenido que modificar ligeramente el comando. Para mi es:

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

Aviso ADDRESSen mayúsculas.

noric
fuente
0

Sí, DBus debe tener una sesión de hacha. Al igual que las respuestas anteriores, 'DBUS_SESSION_BUS_ADDRESS' debe tener un valor antes de comenzar. Sin embargo, podría usar 'dbus-launch' para crear este valor. El siguiente fragmento podría colocarse en un script llamado desde 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> 

Un inconveniente con esta solución es que la sesión podría quedarse después de que haya detenido su software.

karnbo
fuente