我正在尝试通过 X11 转发和 SSH 运行各种 Gnome 应用程序。某些应用程序会导致首先生成“dbus-launch”应用程序。问题是当 X 应用程序退出时 dbus-launch 不会关闭,因此必须在 SSH 会话正确关闭之前被终止。
我假设问题是 X/Gnome 应用程序无法连接到主消息总线守护进程,因此必须启动它们自己的副本?我怎样才能解决这个问题?或者我错过了什么?
这是一个例子。我启用了 X11 转发,似乎一切正常。
[me@host ~]$ gnome-calculator &
[1] 4803
(此处 gcalctool 程序启动并显示到我的删除 X 服务器 (Xming))
[me@host ~]$ ps
PID TTY TIME CMD
4706 pts/0 00:00:00 bash
4803 pts/0 00:00:00 gnome-calculator
4807 pts/0 00:00:00 dbus-launch
4870 pts/0 00:00:00 ps
(现在,在远程会话中关闭 gcalctool 应用程序之后)
[me@host ~]$ ps
PID TTY TIME CMD
4706 pts/0 00:00:00 bash
4807 pts/0 00:00:00 dbus-launch
4898 pts/0 00:00:00 ps
请注意,dbus-launch 仍然处于活动状态。最糟糕的是,这会阻止 SSH 连接正常关闭,直到它被终止。
请注意,系统范围的消息守护进程正在运行,如下所示:
[me@host ~]$ ps ax
4696 ? Ssl 0:00 dbus-daemon --system
我在这里错过了什么?我以前从未见过这种行为。据推测,我只见过可以不受阻碍地连接到消息总线守护进程的应用程序?我在 /etc/dbus-1 中寻找答案,但不知道要寻找什么。
在此先感谢您的帮助。
[编辑]
好的,我意识到我遇到了一个常见问题。这似乎是一种相当普遍的行为,但没有好的解决方案。我正在经历 SSH 挂起,因为 dbus-launch 在 tty 中仍然处于活动状态。但是似乎没有什么好的方法可以让 dbus 启动安静地发生。
查看 /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh 可以提供一些关于“正常”X 会话应该发生什么的线索。当仅调用 X 应用程序到远程 X 服务器时,这当然不起作用。
作为临时解决方法,我已将其添加到我的 .bash_logout 中:
# ~/.bash_logout
pkill -u $USER -t `tty | cut -d '/' -f 3,4` dbus-launch
这将允许 SSH 会话关闭,但感觉很笨拙。有没有更好的解决方案?在没有 dbus 妨碍的情况下运行远程 X11 应用程序的正确方法是什么?
每个 dbus-launch(1):
所以看起来诀窍是先发制人地启动 dbus-daemon,这样程序就可以找到它。我用:
除了 gnome-terminal 之外,它启动 dbus-daemon 并在 gnome-terminal中设置 $DBUS_SESSION_BUS_ADDRESS 。
从 gnome-terminal 运行的任何 X 程序都表现良好,并且 dbus-launch 在 gnome-terminal 退出时自行清理。
我想知道问题是否不是因为未知或不存在的 dbus 会话而出现的。
实际上,当 SSH 会话打开时,它不会启动 dbus 会话。某些程序可能会启动它,但是会话不知道它(因此无法关闭它)。
不知道 dbus 会话也意味着那些使用 dbus 但不自己启动它的程序将会有问题。
dbus 部分是每台机器和每台 X11 显示器。他们的信息存储在 $HOME/.dbus/session-bus/- 但是,那里引用的进程可能已关闭,因此需要额外检查以确定是否需要启动 dbus。然后,那里的变量将被导出到会话中。
然后它就像一个魅力:)
我将以下内容放入我的 .bash_profile 文件中:
注意:hostnamectl 是 systemd 的一部分,允许检索机器 ID,dbus-launch 显示我们想要的变量;通过使用
export $(dbus-launch)
我们检索 dbus-launch 的输出并导出变量如果您希望它在非交互式 sessio 上完成(例如,当从 ssh 运行命令时),请尝试将其放在 .bashrc 中(但要注意 bashrc 在每个打开的 shell 中执行)
我在尝试运行远程 X 命令并在 X 工具退出后退出会话时遇到了同样的问题。
所以我想跑
但不得不使用:
关闭 firefox 后,这也会关闭 ssh 会话。
更新:
这似乎会在服务器上留下大量运行的 dbus-daemon 进程,所以这不是最优的,在两个帐户上添加 --exit-with-session 没有帮助,因为这会恢复原始行为
更新 2:当我使用单引号(如@lobo 所建议的)并添加
kill -TERM $DBUS_SESSION_BUS_PID
以杀死剩余的 dbus-daemon 进程时,这确实有效,正如Holgr Joukl从https://blog.dhampir.no/content/how- to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is-used )