Eseguire un programma dbus in crontab, come sapere sull'ID SESSION?


17

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:


21

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-ided $display_numberè il numero di visualizzazione X ( $DISPLAYè :$display_numbero :$display_number.$screen_number). Il file in ~/.dbus/session-busè analizzabile da una shell e contiene definizioni per 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

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?


2

Penso che se conosci il pid del gestore delle sessioni di gnome, allora leggi l'ambiente dal /procfilesystem.

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.


molto impressionante, in realtà sto usando KDE4, quindi ho cercato plasma-desktopinvece, grazie!
daisy

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

1

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 ADDRESSin lettere maiuscole.


0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.