Запустіть програму dbus у crontab, як знати про ідентифікатор SESSION?


17

Мені потрібно запустити якусь програму в crontab, але як програма може знати про ідентифікатор сесії dbus? доступний лише для програм, запущених менеджерами сеансів.

Відповіді:


21

Проблема дещо схожа на доступ до дисплея 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?


2

Я думаю, якщо ви знаєте 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, тому я шукав plasma-desktopнатомість спасибі!
ромашка


1

Я не можу коментувати відповідь Вінченцо , але я вважаю, що його відповідь найкраще працює на KDE4.

Мені довелося трохи змінити команду. Для мене це:

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

Зверніть увагу ADDRESSвеликими літерами.


0

Так, 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> 

Однією невдачею цього рішення є те, що сеанс може зависнути після зупинки програмного забезпечення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.