Відповіді:
Проблема дещо схожа на доступ до дисплея X і знайти місце розташування файлу X печиво . (Також зверніться до цих питань, якщо ви хочете запустити програму GUI на дисплеї користувача.)
Dbus зберігає адресу сеансу у файлі в ~/.dbus/session-bus
. Назва файлу - $machine_id-$display_number
де $machine_id
випадкове згенероване число, яке зберігається в /var/lib/dbus/machine-id
і $display_number
є номером X відображення ( $DISPLAY
є :$display_number
або :$display_number.$screen_number
). Файл в ~/.dbus/session-bus
аналізується оболонкою і містить визначення для DBUS_SESSION_BUS_ADDRESS
та 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
Будьте уважні, що немає гарантії, що демон dbus все ще доступний. Користувач, можливо, вийшов із системи.
Альтернативний метод - знайти PID процесу в сеансі робочого столу та отримати адресу dbus з його оточення.
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
Якщо crontab працює як root і ви хочете спілкуватися з сеансом того, хто користувач увійшов на консоль, див. Чи можна запустити графічну програму на робочому столі іншого користувача як root?
Я думаю, якщо ви знаєте pid менеджера сеансів gnome, то ви читаєте середовище з /proc
файлової системи.
GNOME_SESSION_PID=<PID_OF_GNOME_SESSION>
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"
Скористайтеся ідентифікатором SESSION тоді з іншими програмами, такими як інструменти notify-send або dbus *.
Ура.
Я не можу коментувати відповідь Вінченцо , але я вважаю, що його відповідь найкраще працює на KDE4.
Мені довелося трохи змінити команду. Для мене це:
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Зверніть увагу ADDRESS
великими літерами.
Так, DBus повинен мати сеанс сокири. Як і попередні відповіді, "DBUS_SESSION_BUS_ADDRESS" перед початком повинен мати значення. Однак ви можете використовувати "dbus-start" для створення цього значення. Наступний фрагмент може бути поміщений у сценарій, який називається з 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>
Однією невдачею цього рішення є те, що сеанс може зависнути після зупинки програмного забезпечення.
plasma-desktop
натомість спасибі!