AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 405518
Accepted
taftster
taftster
Asked: 2012-07-07 12:05:54 +0800 CST2012-07-07 12:05:54 +0800 CST 2012-07-07 12:05:54 +0800 CST

如何配置 D-Bus 和 SSH X-Forwarding 以防止 SSH 在退出时挂起?

  • 772

我正在尝试通过 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 应用程序的正确方法是什么?

linux x11 dbus
  • 3 3 个回答
  • 35429 Views

3 个回答

  • Voted
  1. Best Answer
    Nathan
    2012-07-26T20:02:03+08:002012-07-26T20:02:03+08:00

    每个 dbus-launch(1):

    如果没有为尝试使用 D-Bus 的进程设置 DBUS_SESSION_BUS_ADDRESS,默认情况下,进程将尝试使用 --autolaunch 选项调用 dbus-launch 以启动新的会话总线或在 X 显示上查找现有总线地址或者在 ~/.dbus/session-bus/ 中的文件中

    每当发生自动启动时,必须启动新总线的应用程序将处于自己的小世界中;如果它尝试使用大量总线服务,它最终可能会有效地启动一个全新的会话。这可能不是最理想的,甚至完全被破坏,具体取决于应用程序及其尝试执行的操作。

    自动启动有两个常见原因。一种是通过 ssh 连接到远程机器。

    所以看起来诀窍是先发制人地启动 dbus-daemon,这样程序就可以找到它。我用:

    [me@host ~]$ dbus-launch --exit-with-session gnome-terminal

    除了 gnome-terminal 之外,它启动 dbus-daemon 并在 gnome-terminal中设置 $DBUS_SESSION_BUS_ADDRESS 。

    从 gnome-terminal 运行的任何 X 程序都表现良好,并且 dbus-launch 在 gnome-terminal 退出时自行清理。

    • 16
  2. Pablo Saratxaga
    2015-03-09T05:38:09+08:002015-03-09T05:38:09+08:00

    我想知道问题是否不是因为未知或不存在的 dbus 会话而出现的。

    实际上,当 SSH 会话打开时,它不会启动 dbus 会话。某些程序可能会启动它,但是会话不知道它(因此无法关闭它)。

    不知道 dbus 会话也意味着那些使用 dbus 但不自己启动它的程序将会有问题。

    dbus 部分是每台机器和每台 X11 显示器。他们的信息存储在 $HOME/.dbus/session-bus/- 但是,那里引用的进程可能已关闭,因此需要额外检查以确定是否需要启动 dbus。然后,那里的变量将被导出到会话中。

    然后它就像一个魅力:)

    我将以下内容放入我的 .bash_profile 文件中:

    # set dbus for remote SSH connections
    if [ -n "$SSH_CLIENT" -a -n "$DISPLAY" ]; then
        machine_id=$(LANGUAGE=C hostnamectl|grep 'Machine ID:'| sed 's/^.*: //')
        x_display=$(echo $DISPLAY|sed 's/^.*:\([0-9]\+\)\(\.[0-9]\+\)*$/\1/')
        dbus_session_file="$HOME/.dbus/session-bus/${machine_id}-${x_display}"
        if [ -r "$dbus_session_file" ]; then
                export $(grep '^DBUS.*=' "$dbus_session_file")
                # check if PID still running, if not launch dbus
                ps $DBUS_SESSION_BUS_PID | tail -1 | grep dbus-daemon >& /dev/null
                [ "$?" != "0" ] && export $(dbus-launch) >& /dev/null
        else
                export $(dbus-launch) >& /dev/null
        fi
    fi
    

    注意:hostnamectl 是 systemd 的一部分,允许检索机器 ID,dbus-launch 显示我们想要的变量;通过使用export $(dbus-launch)我们检索 dbus-launch 的输出并导出变量

    如果您希望它在非交互式 sessio 上完成(例如,当从 ssh 运行命令时),请尝试将其放在 .bashrc 中(但要注意 bashrc 在每个打开的 shell 中执行)

    • 6
  3. Jens Timmerman
    2013-10-08T03:30:40+08:002013-10-08T03:30:40+08:00

    我在尝试运行远程 X 命令并在 X 工具退出后退出会话时遇到了同样的问题。

    所以我想跑

    ssh -X user@remotehost "firefox -no-remote"
    

    但不得不使用:

    ssh -X user@remotehost 'export \`dbus-launch\`; dbus-launch firefox -no-remote; kill -TERM $DBUS_SESSION_BUS_PID'
    

    关闭 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 )

    • 3

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve