通知不适用于 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
最后我自己解决了问题。
我会留下我所做的指示。
问题由两部分组成:
- 无法从 Windows 管理器中访问 Dbus
- 通知守护进程无法从 dbus 获取消息
第一个问题解决方案:
真正的问题是,我的Windows管理器是从lxdm运行的,由于某种原因,它不会合并除了/etc/X11/xinit/xinitrc.d
lxde会话之外的配置文件(在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,并按照选择的鼠标进行操作,您需要注释其中之一。