WSL 2 图形应用程序不会从任务栏(或快捷方式)启动,但只有在从首次从 cmd 打开的 wsl 运行时才会启动

WSL 2 图形应用程序不会从任务栏(或快捷方式)启动,但只有在从首次从 cmd 打开的 wsl 运行时才会启动

好的,这是奇怪的行为。我在任务栏中创建了自己的 WSL 快捷方式,以便能够gnome-terminal通过快捷方式 CTRL+ALT+T 打开 Linux 图形应用程序。该快捷方式在我创建它的那天有效,但现在不再有效了。

C:\Users\guill\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Ubuntu以下是位于文件中的快捷方式的命令:wslg ~ gnome-terminal

在这些情况下,应用程序是否会打开取决于我是否已经从 cmd wsl 第一次打开它:

  • 一旦我登录到 Windows,并且我的计算机有足够的时间启动并打开启动应用程序,该应用程序将不会立即通过快捷方式打开。
  • 然后,如果我先打开cmd.exe,然后输入wsl进入wsl,那么我已经在后台打开了wsl。此时,尝试快捷方式仍然不起作用。
  • gnome-terminal然后,如果我在从 cmd 打开的 wsl 命令行会话中输入,gnome 终端将正确打开。如果我随后执行键盘快捷键,gnome 终端将打开。

请注意,在上面的文字中,每次我说我按下键盘快捷键时,其结果都与尝试从任务栏中的固定图标打开应用程序相同,反之亦然。带有wslg ~ gnome-terminal开始菜单文件夹中的命令的那个。

那么这是怎么回事呢?似乎图形应用程序至少需要打开一次,然后我才能从开始菜单或键盘快捷键打开它们。我希望 WSL 始终在启动时打开。我还希望 WSL 始终准备好从快捷方式打开应用程序。我不知道现在该怎么做。

我正在考虑在这台电脑上再次安装 Linux。WSL 目前不符合我的期望。我使用的是 Windows 11。

谢谢!

答案1

简短回答:

尝试:

wslg ~ dbus-launch gnome-terminal

解释:

这似乎不是一般“图形应用程序”的问题,而是特定应用程序的问题。

例如,如果您以xterm相同的方式安装并将其设置为快捷方式,我认为您会发现该快捷方式按您预期的方式工作,而无需先前从命令行启动。

另一方面,Gnome Terminal 是一个 Gnome 应用程序(显而易见)。大多数 Gnome 应用程序需要至少D-Bus 支持,许多都需要 Systemd。幸运的是,Gnome Terminal 只需要 D-Bus。

如果您从新 WSL 实例中的命令行启动它,您将看到ps -efH它已为您启动了一个用户会话 D-Bus 实例。如果您已gvfs安装(默认情况下未安装,尽管它可能作为 Gnome Terminal 的依赖项安装),您还会看到它的守护进程已启动(通过 D-Bus)。

因此,当您随后启动时wslg ~ gnome-terminal,D-Bus 已在运行并且 Gnome Terminal 正确启动。(笔记:它实际上比这稍微复杂一些,因为 Gnome Terminal 实际上是作为客户端-服务器应用程序的一部分启动的,而在这种情况下服务器并没有启动。)

但是当您尝试通过以下方式直接启动它时:

  • wslg ~ gnome-terminal
  • 或者甚至只是wsl ~ gnome-terminal

... 那么在我看来,一个相当不为人知的 WSL 错误开始发挥作用。这可能是 WSL 启动时的“预期”情况,但我以前遇到过这种情况,而且出现对我来说,WSL 的init进程在收割和终止启动期间由另一个进程启动的孤立进程方面过于积极。

因此,在这种情况下,据我所知(我还没有strace确认),Gnome Terminal 尝试启动 D-Bus,但它init会将其关闭(不正确,我相信)。因此,如果没有运行 D-Bus,Gnome Terminal(我相信实际上是服务器)就无法启动。

不过,上面的解决方法明确启动了 Gnome 终端里面D-Bus 会话,因此一切都按预期工作。

答案2

这听起来与我的问题非常相似:Windows 11 WSL LxTerminal 在按下第一个字符后关闭

我的解决方法是从启动文件夹自动启动一些 Ubuntu 服务,如下所示(从我自己的帖子中复制并粘贴):

  1. 创建/home/ktuulos/scripts/init-wsl.sh以下内容,并将其修改为可执行文件:

    #!/bin/sh
    sudo service rsyslog start
    sudo service cron start
    
  2. 创建/etc/sudoers.d/10-service(使用visudo):

    %sudo   ALL=(ALL) NOPASSWD: /usr/sbin/service
    
  3. 打开 Windows 文件资源管理器,进入shell:startup文件夹并创建文件init-wsl.cmd

    wsl /home/ktuulos/scripts/init-wsl.sh
    

相关内容