Devo eseguire qualche programma all'interno di crontab, ma come può il programma conoscere l'ID della sessione dbus? è disponibile solo per i programmi lanciati dai gestori di sessioni.
Devo eseguire qualche programma all'interno di crontab, ma come può il programma conoscere l'ID della sessione dbus? è disponibile solo per i programmi lanciati dai gestori di sessioni.
Risposte:
Il problema è in qualche modo simile ad accedere alla visualizzazione X e trovare la posizione del file X biscotto . (Inoltre, fare riferimento a queste domande se si desidera avviare un programma GUI sul display dell'utente.)
Dbus memorizza l'indirizzo della sessione in un file in ~/.dbus/session-bus
. Il nome del file è $machine_id-$display_number
, dove $machine_id
è memorizzato un numero generato casualmente /var/lib/dbus/machine-id
ed $display_number
è il numero di visualizzazione X ( $DISPLAY
è :$display_number
o :$display_number.$screen_number
). Il file in ~/.dbus/session-bus
è analizzabile da una shell e contiene definizioni per 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
Attenzione che non esiste alcuna garanzia che il demone dbus sia ancora disponibile. L'utente potrebbe essersi disconnesso.
Un metodo alternativo consiste nel trovare il PID di un processo nella sessione desktop e ottenere l'indirizzo dbus dal suo ambiente.
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
Se crontab è in esecuzione come root e si desidera comunicare con la sessione di qualsiasi utente abbia effettuato l'accesso sulla console, vedere Posso avviare un programma grafico sul desktop di un altro utente come root?
Penso che se conosci il pid del gestore delle sessioni di gnome, allora leggi l'ambiente dal /proc
filesystem.
GNOME_SESSION_PID=<PID_OF_GNOME_SESSION>
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"
Utilizzare quindi l'id SESSIONE, con altri programmi come strumenti di notifica-invio o dbus *.
Saluti.
Non posso commentare la risposta di Vincenzo , ma trovo che la sua risposta funzioni meglio per me su KDE4.
Ho dovuto modificare leggermente il comando però. Per me è:
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Avviso ADDRESS
in lettere maiuscole.
Sì DBus deve avere una sessione ax. Come le risposte precedenti, 'DBUS_SESSION_BUS_ADDRESS' deve avere un valore prima di iniziare. Tuttavia, è possibile utilizzare 'dbus-launch' per creare questo valore. Il frammento seguente può essere inserito in uno script chiamato da 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 questa soluzione è che la sessione potrebbe rimanere in sospeso dopo aver arrestato il software.
plasma-desktop
invece, grazie!