Уведомления и демон уведомлений не работают в оконном менеджере

13

Уведомления не работают в автономных оконных менеджерах Linux (Openbox, Awesome WM и т. Д.). Я пытался установить Notification-Daemon и Dunst, но при отправке с помощью notify-send "something"не открывается окно.

Я попытался запустить polkit-gnome-agent и запустить демоны уведомлений напрямую, но это не помогло (в то время как я решил подобную проблему подобным образом, но теперь это ничего не делает).

Нет никаких признаков ошибок, если я не отправляю тривиальное уведомление с python, тогда я получаю только смутное сообщение об ошибке: File "/usr/lib/python3.3/site-packages/gi/types.py", line 113, in function return info.invoke(*args, **kwargs) gi._glib.GError: Could not connect: Connection refused Тривиальная программа C ничего не выводит (например, без ошибок).

Я использую Archlinux с systemd и d-bus, я подозреваю, что это проблема с polkit или каким-то демоном, который не запускается при запуске оконного менеджера, но понятия не имею, что я могу попробовать или как я могу получить больше значимых сообщений об ошибках.

РЕДАКТИРОВАТЬ: я взял пример кода оттуда: https://wiki.archlinux.org/index.php/Libnotify#Python

Dbus должен быть запущен, потому что systemd имеет его как зависимость. Я libnotifyустановил - это пакет, который обеспечивает notify-send. Также демон уведомлений должен запускаться по мере необходимости (только при получении уведомлений) следующим файлом рабочего стола /usr/share/dbus-1/services/org.freedesktop.Notifications.service:

[D-BUS Service]
Name=org.freedesktop.Notifications
Exec=/usr/bin/dunst

Я даже пытался запускать демоны напрямую (просто выполнять) и пытался отправлять уведомления. Если somenone знает, как я могу получить больше информации, пожалуйста, не стесняйтесь предлагать.

РЕДАКТИРОВАТЬ 2: Я попытался запустить демон уведомлений с sudo: sudo notification-daemon_name &(в моем случае sudo dunst &), а sudo notify-send somethingзатем уведомление работает. Но когда я пытаюсь выполнить какое-либо из предыдущих действий от имени непривилегированного пользователя (что важно, большинство программ отправляют уведомления непривилегированным пользователям), ничего не отображается.

notification-daemon отказывается работать вообще без каких-либо ошибок или предупреждений.

РЕДАКТИРОВАТЬ 3: Очевидно, это проблема с разрешениями: я не могу отправлять уведомления без root-доступа. После чистой перезагрузки: sudo notify-send "something"работает даже без ручного запуска каких-либо демонов, однако что я (и мои запущенные программы) должен сделать, чтобы иметь возможность отправлять уведомления без привилегий root, как это возможно в Gnome или любых других средах полного рабочего стола?

IBr
источник
1
Что означает "попытался установить компонент-уведомитель"? Вы установили, libnotifyпоскольку это обеспечивает notify-sendкоманду (это все, что вам нужно)?
Джейсонвриан
Вы дали слишком мало информации, чтобы правильно ответить на этот вопрос. Основываясь на единственном сообщении об ошибке, которое вы дали, я подозреваю, что DBus не работает и, следовательно, нет ничего для уведомления-отправки для подключения. Если вы предоставили свой код «тривиального уведомления» и точную ошибку, мы могли бы приблизиться к ответу.
MSS
Я взял примеры кодов оттуда: wiki.archlinux.org/index.php/Libnotify#Python
13
У меня был успех с Данстом. Больше нет сообщений «Отказ в соединении».
шоу

Ответы:

6

Наконец я решил проблему сам.

Я оставлю инструкции, что я сделал.

Проблема состоит из двух частей:

  1. Доступ к Dbus невозможен из оконного менеджера
  2. Демон уведомления не может получать сообщения от dbus

1-е решение проблемы:

Реальная проблема заключалась в том, что мой менеджер окон был запущен из lxdm, который по какой-то причине не объединяет конфигурационные файлы, /etc/X11/xinit/xinitrc.dза исключением сеанса lxde (в LXDE работает dbus, в удивительном wm - нет). В этой папке существует файл с именем 30-dbusследующего содержания:

#!/bin/bash

# launches a session dbus instance
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] && type dbus-launch >/dev/null; then
  eval $(dbus-launch --sh-syntax --exit-with-session)
fi

Эта часть кода определяет $DBUS_SESSION_BUS_ADDRESSпеременную, которая определяет порт dbus для использования в различных приложениях.echo $DBUS_SESSION_BUS_ADDRESSможет использоваться как простая проверка работоспособности, чтобы увидеть, существует ли сеанс dbus (он должен возвращать файл сеанса dbus).

Файлы конфигурации из этой папки могут быть объединены с простым сценарием оболочки при запуске сеанса (код взят из .xinitrc):

#!/bin/bash

if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

2-е решение проблемы:

Несмотря на то, что dbus работает и доступен для других программ, ему все еще нужен больший доступ для корректной работы уведомлений, поэтому мне нужно было запустить агент polkit, потому что в Awesome WM его нет. Я выбрал lxpolkit, потому что у меня уже была почти полная среда lxde. В моем случае, просто добавили в мой ~/.config/awesome/rc.luaфайл: awful.util.spawn_with_shell("dex /etc/xdg/autostart/lxpolkit.desktop")по какой-то причине без этой строки он отказался запускаться по умолчанию с lxdm.

Я думаю, что агент Gnome Polkit тоже должен работать.

IBr
источник
1
примечание: ваш менеджер дисплеев не делает и не должен ничего делать с .xinitrc/ я забыл, как называется другой вариант. эти файлы эквивалентны (какой из них зависит от дистрибутива) и используются только при вызове startxили xinitиз консоли. вероятно, причина загрузки системного файла заключается в том, что это происходит в LXDE, а не в LXDM.
августа
Спасибо за разъяснение. Похоже, мне нужно сделать дополнительную загрузку конфигурации самостоятельно.
IBr
да, как вы должны это сделать, зависит от окружения рабочего стола / WM.
стружка
как правило, все, что вам нужно сделать, .xinitrcэто запустить любые фоновые демоны, которые не будут включены позже (вы сделаете это, если у вас не было, например, gnome-sessionсделать это для вас), а затем в самой последней строке, execкакую бы среду WM / desktop вы не использовали ,
стружка
0

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

Спасибо за добавление дополнительных деталей. Вероятно, у вас есть проблема с разрешениями, но, к сожалению, она связана с разрешениями, необходимыми для подключения к сокету домена DBus Unix.

Чтобы подтвердить этот запуск без полномочий root:

$ strace -o /tmp/ns.out notify-send "why will this not connect"
$ grep '^connect' /tmp/ns.out
connect(4, {sa_family=AF_FILE, path=@"/tmp/dbus-6AIOJVWzCC"}, 23) = 0

за исключением того, что вы, вероятно, получите что-то вроде

connect(…) = -1 ECONNREFUSED  (Connection refused)

Почему? Я понятия не имею. Я знаю, что подсистема уведомлений привлекла гораздо больше внимания в сообществе разработчиков GNOME, чем я когда-либо думала, что такая поверхностно простая функция должна. Я подозреваю, что какой-то конфигурационный файл находится в zillion или около того местах конфигурации GTK, но я знаю, что это не слишком полезно

MSW
источник
В самом деле, я получилconnect(4, {sa_family=AF_LOCAL, sun_path=@"/tmp/dbus-WC3XySChb5"}, 23) = -1 ECONNREFUSED (Connection refused) connect(4, {sa_family=AF_LOCAL, sun_path=@"/tmp/dbus-b3oei13hP2"}, 23) = -1 ECONNREFUSED (Connection refused)
IBr
0

У меня получилось установить notify-osd и dunst на i3wm.

anstue
источник