Мне нужно запустить какую-нибудь программу в crontab, но как программа может узнать об идентификаторе сессии dbus? он доступен только для программ, запущенных менеджерами сеансов.
Мне нужно запустить какую-нибудь программу в crontab, но как программа может узнать об идентификаторе сессии dbus? он доступен только для программ, запущенных менеджерами сеансов.
Ответы:
Проблема в некоторой степени похожа на доступ к 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?
Я думаю, что если вы знаете 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.
Я должен был немного изменить команду, хотя. Для меня это:
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-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>
Один недостаток этого решения заключается в том, что сеанс может зависать после того, как вы остановили свое программное обеспечение.
plasma-desktop
вместо этого, спасибо!