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

17

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

маргаритка
источник

Ответы:

21

Проблема в некоторой степени похожа на доступ к X-дисплею и нахождение местоположения X-файла cookie . (Также обращайтесь к этим вопросам, если вы хотите запустить программу с графическим интерфейсом на дисплее пользователя.)

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 * tools.

Приветствия.

Никхил Мулли
источник
очень впечатляет, на самом деле я использую KDE4, поэтому я искал plasma-desktopвместо этого, спасибо!
Дейзи
1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Винченцо
источник
1

Я не могу комментировать ответ Винченцо , но я считаю, что его ответ лучше всего подходит для меня на KDE4.

Я должен был немного изменить команду, хотя. Для меня это:

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

Обратите внимание ADDRESSна заглавные буквы.

noric
источник
0

Да, DBus должен иметь сеанс топора. Как и в предыдущих ответах, «DBUS_SESSION_BUS_ADDRESS» должен иметь значение перед началом. Тем не менее, вы можете использовать 'dbus-launch' для создания этого значения. Следующий фрагмент может быть вставлен в скрипт, вызываемый из 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> 

Один недостаток этого решения заключается в том, что сеанс может зависать после того, как вы остановили свое программное обеспечение.

karnbo
источник