跨登录会话重用 D-Bus 会话

跨登录会话重用 D-Bus 会话

我通过多个登录会话访问一台计算机。会话的生命周期可能重叠也可能不重叠。就我而言,这些登录会话当前始终通过 SSH 进行,但我也更愿意处理本地会话。

我有时在这些会话中需要 D-Bus,并且我想在这些登录会话之间共享相同的 D-Bus 会话,为了使用GVFS

推荐的方法是什么?我不想破坏我可能不知道的 D-Bus 的任何使用。我考虑过使用

export $(dbus-launch --autolaunch $(cat /var/lib/dbus/machine-id))

但是(从 Ubuntu 12.04 开始)这似乎不对:

  • 这需要 X 会话,但我的 SSH 会话可能会也可能不会转发 X 显示,甚至那些转发的会话也不会具有相同的$DISPLAY
  • 如果没有可用的 X 显示,dbus-launch则会抱怨“自动启动错误:X11 初始化失败”。并且不启动守护进程;
  • 手册dbus-launch页指出“该--autolaunch选项被视为内部实现细节(...)。无论如何,没有真正的理由在 libdbus 实现之外使用它。”

dbus-launchD-Bus 套件中的其他工具是否支持自动检测正在运行dbus-daemon并连接到它?如果 D-Bus 通过 X 连接启动,则必要的信息就在其中~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-${DISPLAY#*:},但如果没有可用的 X 连接,则似乎不会存储在任何地方。

我应该拼凑自己的 D-Bus 会话文件吗?如果这样做,我应该使用目录中的文件~/.dbus/session-bus吗?该路径是否/var/lib/dbus/machine-id可靠且可移植?

答案1

DBus 使得共享 dbus 守护进程的设置变得有点棘手。

对于我的设置,设置dbus-launch --sh-syntax保存在一个由.bash_rc.这样做的缺点是,每次重新启动后,该过程都是手动执行的。

然而,检查现有的 DBus 守护进程应该非常简单。假设设置文件位于 $HOME/.dbus_settings:

need_start=1

if [ -r "$HOME/.dbus_settings" ]
then
    . "$HOME/.dbus_settings"
fi

if [ -n "$DBUS_SESSION_BUS_PID" ]
then
    if kill -0 "$DBUS_SESSION_BUS_PID" 2>/dev/null
    then
        need_start=0  # Found one
    fi
fi

if [ "$need_start" -ne 0 ]
then
    dbus-launch --sh-syntax >"$HOME/.dbus_settings"
    . "$HOME/.dbus_settings"
fi

如果没有这个--autolaunch选项,我认为不需要 X windows 连接。

相关内容