解决了!

解决了!

我已经开始尝试将 Docker 用于我的日常开发环境,以便(原则上)轻松地从任意机器上工作,而无需进行大量设置。我的环境基于 Emacs+Slime,运行自定义 Common Lisp 映像(尽管我不认为 Slime/Common Lisp 部分很重要——我很确定普通的 Emacs 会遇到下面描述的相同问题)。

当前主机环境是 Windows10/WSL2,Docker 在 WSL2 中运行。我从 Windows Terminal WSL Ubuntu shell 启动我的容器,如下所示:


docker run -d -it -rm -e DISPLAY="${DISPLAY}" <my-container-name> <command-within-container-to-launch-emacs>

其中我已将 ${DISPLAY} 设置为我的 Windows 主机的 IP 地址,并.profile在登录时在我的 WSL Ubuntu 中使用以下命令进行设置:


export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0

docker run命令顺利地通过我安装的 X410 XWindow 客户端(设置为“允许公共访问”)在我的 Windows10 桌面上启动了我的 Emacs 窗口。

如果我正在积极使用系统并与 emacs 窗口交互,它会在无限的时间内完美运行。

如果系统闲置哪怕很短的时间,也会出现问题(我认为主机甚至不必进入睡眠状态——只需让 emacs 窗口闲置几分钟就会出现问题)。问题是 emacs 窗口(以及整个 docker 容器)只是默默退出。

有人能指导我如何解决容器静默退出的问题吗?例如,我应该查看某个日志文件吗?

由于这种情况似乎只发生在 X Window 应用程序中,也许这是 X Window 或 X410 社区的问题,而不是 docker 问题?如果是这样,请随时将我推到那里。

或者也许这是一个 emacs(gtk)特定的问题,我需要联系该社区?

或者也许是 WSL2 的问题?(尽管直接从 WSL2 Ubuntu Windows 终端启动的 emacs(gtk)也通过 X410 显示,即使在机器(LG Gram 笔记本电脑)睡眠和唤醒期间也能无限期地保持运行。

但是除了使用 docker 之外,我在任何其他环境中都没有遇到过 emacs-gtk 的这个问题,所以我想先在这里问一下。

任何指导都值得赞赏。

谢谢

答案1

解决了!

我遇到过和你一样的问题,最近才找到一个可行的解决方案。我认为这与 Emacs 本身无关。

我曾尝试使用 Vcxsrv 和 X410 在 Windows 中运行图形化 Linux 应用程序,然后我注意到 x410 有一个新版本 3.1.0,它支持VSock。我认为这是关键,因为主机 Windows 和 WSL2 之间的 IP 流量似乎存在一些问题。
(通常这是不可见的,但当 X-server 使用 tcp-ip-address 进行通信时就会可见)

下载 X410 最新版本并设置 vsock 后,我的所有问题都解决了。他们针对 vsock 的解决方案可能也适用于 vcxsrv,但我没有尝试过,因为 x410 在图形中提供了更好的细节,我更喜欢这一点。

为什么使用 vsock?

使用 vsock 可以独立于 TCP 和 IP 地址,这对我来说是个问题。有了这个解决方案,我可以切换网络而不会丢失任何 Linux 应用程序 GUI。快乐的日子!

这是我做的:

下载适用于 Windows 的 X410 版本 3.1.0 并安装 -https://x410.dev/#download

  1. 开始_X410:/mnt/c/Program\ Files/Choung\ Networks/X410/X410.exe &

使用选项 VSOCK OPTION 2 修改 XCB -https://x410.dev/cookbook/transparently-adding-native-support-for-vsock-in-x11-apps

  1. 下载预建库 -https://gitlab.com/vsockfy/libxcb-1.14-vsock/-/releases/v1.14-vsock
  2. 重命名旧的 libxcb.so:sudo mv /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0 /usr/lib/x86_64-linux-gnu/libxcb.backup.so.1.1.0
  3. 将下载的文件复制到位(预先移动到您的文件夹):sudo cp libxcb.se.1.1.0 /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
  4. 验证功能:(export DISPLAY=vsock/:0; xset q 如果成功则应响应‘键盘控制:......’)

将别名和函数添加到您的 .bashrc 或类似文件中:

  1. 添加别名以启动 X410
alias xlaunch='/mnt/c/Program\ Files/Choung\ Networks/X410/X410.exe &'
  1. 添加功能:
function x_display {
  export DISPLAY="vsock/:0"
  export QT_SCALE_FACTOR=1
  export GDK_SCALE=1
  if ! timeout 1s xset q &>/dev/null; then
    taskkill.exe /IM X410.exe &> /dev/null && echo "Running X was killed!"
    echo "Starting X..."
    xlaunch
    sleep 2
  fi
  echo "X for WSL instantiated on $DISPLAY"
}
  1. 添加别名来启动 intellij(我这样做的原因):
alias intellij='x_display; /opt/idea/bin/idea.sh &> /dev/null &'
  1. 保存你的 .bashrc
  2. 获取已更改的 .bashrc:source ~/.bashrc
  3. 启动 Intellij:intellij

相关内容