Exécutez un programme dbus dans crontab, comment connaître l'ID SESSION?

17

J'ai besoin d'exécuter un programme dans crontab, mais comment le programme peut-il connaître l'ID de session dbus? il est uniquement disponible pour les programmes lancés par les gestionnaires de session.

Marguerite
la source

Réponses:

21

Le problème est un peu similaire à l' accès à l'écran X et trouver l'emplacement du fichier cookie X . (Consultez également ces questions si vous souhaitez lancer un programme GUI sur l'écran de l'utilisateur.)

Dbus stocke l'adresse de session dans un fichier dans ~/.dbus/session-bus. Le nom du fichier est $machine_id-$display_number, où $machine_idest un nombre généré de façon aléatoire stocké dans /var/lib/dbus/machine-idet $display_numberest le numéro d'affichage X ( $DISPLAYest :$display_numberou :$display_number.$screen_number). Le fichier dans ~/.dbus/session-busest analysable par un shell et contient les définitions de DBUS_SESSION_BUS_ADDRESSet 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

Attention, rien ne garantit que le démon dbus est toujours disponible. L'utilisateur s'est peut-être déconnecté.

Une autre méthode consiste à trouver le PID d'un processus dans la session de bureau et à obtenir l'adresse dbus à partir de son environnement.

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

Si la crontab s'exécute en tant que root et que vous souhaitez communiquer avec la session de n'importe quel utilisateur connecté sur la console, voir Puis-je lancer un programme graphique sur le bureau d'un autre utilisateur en tant que root?

Gilles 'SO- arrête d'être méchant'
la source
2

Je pense que si vous connaissez le pid du gestionnaire de session gnome, alors vous lisez l'environnement depuis le /procsystème de fichiers.

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

Utilisez ensuite l'ID SESSION, avec d'autres programmes comme les outils notify-send ou dbus *.

À votre santé.

Nikhil Mulley
la source
très impressionnant, en fait je lance KDE4, donc j'ai cherché à la plasma-desktopplace, merci!
marguerite
1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Vincenzo
la source
1

Je ne peux pas commenter la réponse de Vincenzo , mais je trouve que sa réponse me convient le mieux sur KDE4.

J'ai cependant dû légèrement modifier la commande. Pour moi, c'est:

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

Avis ADDRESSen majuscules.

noric
la source
0

Oui, DBus doit avoir une session ax. Comme les réponses précédentes, 'DBUS_SESSION_BUS_ADDRESS' doit avoir une valeur avant de commencer. Cependant, vous pouvez utiliser 'dbus-launch' pour créer cette valeur. L'extrait suivant peut être placé dans un script appelé depuis 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 inconvénient de cette solution est que la session peut rester après l'arrêt du logiciel.

karnbo
la source