通知和通知守护程序在窗口管理器上不起作用


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

我什至尝试直接运行守护程序(只是执行)并尝试发送通知。如果有人知道如何获取更多信息,请随时提出建议。

编辑2:我试图运行使用sudo通知守护程序:sudo notification-daemon_name &(对我来说sudo dunst &)和sudo notify-send something,然后通知的作品。但是,当我尝试以非特权用户身份执行之前的任何操作(这对于大多数程序以非特权用户身份发送通知很重要)时,什么都没有显示。

notification-daemon 拒绝工作而没有任何错误或警告。

编辑3:显然是权限问题:没有root访问权限,我无法发送通知。干净重启后:sudo notify-send "something"即使没有手动启动任何守护程序也可以工作,但是我(和我启动的程序)应该如何做才能在没有root特权的情况下发送通知,这在Gnome或任何其他完整桌面环境中是可能的?


1
“尝试安装通知守护程序”是什么意思?您是否安装libnotify了该程序,因为它提供了notify-send命令(您所需要的全部)?
jasonwryan

您提供的信息太少,无法正确回答此问题。根据您给出的唯一错误消息,我怀疑DBus没有运行,因此没有通知发送连接。如果您提供了“琐碎的通知”代码和确切的错误,我们也许可以更接近答案。
msw

我从那里获取
IBr

我在Dunst上取得了成功。不再有“连接被拒绝”消息。
sshow

Answers:


6

最后我自己解决了问题。

我将留下我所做的指示。

该问题包括两个部分:

  1. 无法从Windows Manager中访问Dbus
  2. 通知守护程序无法从dbus获取消息

第一个问题解决方案:

真正的问题是,我的Windows管理器是从lxdm运行的,出于某种原因,它不合并/etc/X11/xinit/xinitrc.dlxde会话以外的配置文件(在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会话文件)。

此文件夹中的配置文件可以在会话开始时与简单的shell脚本合并(代码取自.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

第二个问题解决方案:

尽管dbus正在运行并且可用于其他程序,但它仍需要更多访问权限才能使通知正常工作,所以我需要运行polkit代理,因为Awesome WM没有。我lxpolkit之所以选择,是因为我已经拥有几乎完整的lxde环境。就我而言,只是添加到我的~/.config/awesome/rc.lua文件:中 awful.util.spawn_with_shell("dex /etc/xdg/autostart/lxpolkit.desktop"),由于某种原因,如果没有此行,它默认情况下拒绝以lxdm启动。

我认为gnome polkit代理也应该可以正常工作。


1
注意:您的显示管理器不会也不应该对.xinitrc/ 做任何事情,否则我会忘记所谓的其他味道。这些文件是等效的(使用的文件因发行版而异),仅在您从控制台调用startxxinit从控制台调用时才使用。加载系统文件的原因可能是因为它发生在LXDE中,而不是LXDM中。
凌晨

感谢您的澄清。看来我需要自己进行附加配置。
IBr 2013年

是的,您该怎么做取决于桌面环境/ wm。
凌晨

通常,您要做的.xinitrc就是启动任何以后不会启用的后台守护程序(如果没有,例如gnome-session,为您执行此操作,则可以这样做),然后在最后一行,exec无论使用哪种WM /桌面环境。
奋斗

0

这不是一个答案,只是一个很大的澄清,可能有助于产生下一个问题。

感谢您添加额外的细节。您可能确实有权限问题,但不幸的是,很可能是连接到DBus Unix域套接字所需的权限。

要确认是否以非超级用户身份运行:

$ 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开发社区中得到了比我以前认为的如此表面上简单的功能更多的关注。我怀疑在数以千计的GTK配置位置中有一些配置文件,但是我知道这并不太有用。


的确,我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

对我来说,它可以在i3wm上安装notify-osd和dunst。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.