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

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

通知不适用于 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

最后我自己解决了问题。

我会留下我所做的指示。

问题由两部分组成:

  1. 无法从 Windows 管理器中访问 Dbus
  2. 通知守护进程无法从 dbus 获取消息

第一个问题解决方案:

真正的问题是,我的Windows管理器是从lxdm运行的,由于某种原因,它不会合并除了/etc/X11/xinit/xinitrc.dlxde会话之外的配置文件(在LXDE dbus中有效,在awesome 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 代理也应该可以正常工作。

答案2

这不是一个答案,只是一个重要的澄清,也许有助于产生下一个问题。

感谢您添加额外的细节。您可能确实遇到权限问题,但不幸的是,它可能存在于连接到 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 开发社区中得到的关注比我想象的如此表面简单的功能要多得多。我怀疑在无数个 GTK 配置位置中有一些配置文件,但我知道这并没有太大帮助。

答案3

对我来说,在 i3wm 上安装 notification-osd 和 Dunst 是有效的。

答案4

只要编辑配置文件,Dunst 就相当简单。

我使用 jwm 窗口管理器,并且必须注释掉所有键盘快捷键,因为它们与 jwm 键盘快捷键冲突。

此外,它默认选择了监视器 0,并按照选择的鼠标进行操作,您需要注释其中之一。

相关内容