我通过多个登录会话访问一台计算机。会话的生命周期可能重叠也可能不重叠。就我而言,这些登录会话当前始终通过 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-launch
D-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 连接。