这是我的问题的史前史,如果需要更多细节,实际问题在第二段。
所以几个月来我一直在不同的 Linux 发行版上使用独立的窗口管理器,为了启动我刚刚放入exec awesome
.xinitrc 的 WM,所以我没有启动 dbus 守护进程。在像 Debian 这样的 systemd 系统上,我注意到 D-Bus 用户会话在我运行 AwesomeWM 时会自动启动。当我使用带有 runit init 系统的 Void Linux 时也发生了同样的情况。现在我在 Artix Linux 上将 Emacs 作为窗口管理器运行,它也不使用 systemd,在我的 .xinitrc 中有这一行exec emacs
,它运行得非常好。但是没有为 Emacs 启动 dbus 守护进程,因此在其中运行的所有应用程序都不使用 DBus。我怀疑这不正常。
当使用没有 D-Bus 会话守护程序的独立窗口管理器时,这是否意味着我的应用程序的某些功能可能不可用?或者如果我的 WM 在没有 D-Bus 守护程序的情况下工作正常,这是否意味着我正在使用的应用程序不使用 D-Bus?那么如果某些应用程序需要 D-Bus 会话会发生什么?或者,如果会话本地 D-Bus 守护程序不可用,我的应用程序可能正在连接到系统范围的 D-Bus 守护程序?这怎么可能?
许多程序要么根本不使用 D-Bus,要么不使用会话总线(例如,它们可能只需要与系统总线上的服务对话),或者在会话总线不可用的情况下使用后备。例如,一个邮件应用程序可能只需要会话总线来发送弹出通知(由 awesomewm 的
naughty
模块显示)而不需要其他任何东西,因此即使总线不可用,应用程序的 99% 的功能仍然存在。(会话和系统总线不可互换——它们有不同的用途和不同的策略。每个系统只有一个系统总线,但每个 UID 有一个会话总线(或传统上每个 X11 显示器);系统总线只允许特权进程“托管” ' 一个服务,而会话总线将所有特权授予它运行的任何 UID。)
然而, libdbus(最常用的 D-Bus 客户端库)有一个自动启动机制,
dbus-daemon --session
如果还没有可用的,它会自动生成一个。只要您的发行版没有禁用此功能,第一个需要会话总线的程序将导致一个自动启动并存储其套接字地址以~/.dbus/
供其他程序查找。自动启动不是很好,原因与“sudo /etc/init.d/foo start”不是一样 - 有时应该只影响一个特定应用程序的不需要的环境可能会泄漏到自动生成的守护进程中,并从它进入所有总线衍生的服务。因此,在基于 systemd 的发行版中,“用户会话”总线作为用户服务启动(这发生在登录时,早在 WM 启动之前),而在其他发行版中,通常建议从您的 xinitrc 显式启动它。
(随着越来越多的应用程序将会话总线用于各种目的,我建议即使您的设置中还没有任何需要会话总线的应用程序也启动它。守护程序仅在实际转发消息时才使用资源,因此拥有它并没有什么坏处在后台闲置。)
如果在您的 xinitrc 中确实启动了一件事,则最容易将其包装在
dbus-run-session
:如需更详细的 xinitrc 脚本,请包装整个脚本:
或使用以下命令启动总线
dbus-launch
: