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.
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_id
es un número generado aleatoriamente almacenado /var/lib/dbus/machine-id
y $display_number
es el número de visualización X ( $DISPLAY
es :$display_number
o :$display_number.$screen_number
). El archivo ~/.dbus/session-bus
es analizable por un shell y contiene definiciones para DBUS_SESSION_BUS_ADDRESS
y 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?
Creo que si conoces el pid del administrador de sesión de gnome, entonces lees el entorno del /proc
sistema 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.
plasma-desktop
lugar, ¡gracias!fuente
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:
Aviso
ADDRESS
en mayúsculas.fuente
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.
Un inconveniente con esta solución es que la sesión podría quedarse después de que haya detenido su software.
fuente