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.
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:
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_id
est un nombre généré de façon aléatoire stocké dans /var/lib/dbus/machine-id
et $display_number
est le numéro d'affichage X ( $DISPLAY
est :$display_number
ou :$display_number.$screen_number
). Le fichier dans ~/.dbus/session-bus
est analysable par un shell et contient les définitions de DBUS_SESSION_BUS_ADDRESS
et 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?
Je pense que si vous connaissez le pid du gestionnaire de session gnome, alors vous lisez l'environnement depuis le /proc
systè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é.
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 ADDRESS
en majuscules.
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.
plasma-desktop
place, merci!