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.

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?


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é.


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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.