微软专家 发表于 2026-6-5 10:32:43

WSL 2 后台保活实践:让 Hermes Agent 持续运行不再被终端关闭打断

WSL 2 作为轻量级 Hyper-V 虚拟机,其默认行为是当没有活跃的 Linux 进程或终端会话时自动关闭,以释放系统资源。这一机制对于长期运行的后台服务(如 Hermes Agent)而言,意味着一旦关闭 PowerShell 或 Windows Terminal,WSL 实例就会退出,导致服务中断。本文基于实际开发场景,提供一套低资源占用且稳定的保活方案,结合 systemd 实现服务的自动启动与持久运行。

首先理解 WSL 2 的终止条件:当虚拟机内没有运行中的 Linux 进程、没有活跃的终端连接,或超过空闲超时阈值时,WSL 2 会自动终止。常见的粗暴保活方式(如在前台执行 sleep infinity)虽然有效,但会持续占用 CPU 与内存资源,不够优雅。

推荐的最佳实践是启动一个轻量级守护进程来模拟“有进程在运行”的状态,从而阻止 WSL 自动关闭。具体方案是使用 dbus-launch 命令。核心命令如下:

@start /b wsl --exec dbus-launch true

此命令中,start /b 使得命令在后台静默运行且不弹出新窗口;--exec 参数直接执行指定命令而不启动交互式 Shell;dbus-launch true 则会启动 D-Bus Session Bus 守护进程(true 命令立即退出),但守护进程本身会持续存在,让 WSL 误以为仍有进程活动,从而保持虚拟机活跃。该方式资源占用极低,是目前最优雅的 WSL 后台保活手段。

实施步骤分为两步:创建开机自启动脚本,以及配置 systemd 管理服务。

第一步,创建开机自启动文件。按 Win + R 输入 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 打开启动文件夹,新建一个文本文件并命名为 wslstart.cmd,内容如下:

@echo off
:: 保持 WSL 后台运行,供 Hermes Agent 使用
start /b wsl -d Ubuntu --exec dbus-launch true

请将 Ubuntu 替换为你实际安装的发行版名称(可通过 wsl -l -v 查看)。保存后重启电脑,WSL 将自动在后台启动并保持运行。

第二步,配置 systemd 管理服务,使 Hermes Agent 能够随 WSL 自动启动并崩溃后自动重启。WSL 2 自 2022 年起已原生支持 systemd,启用方法为编辑 /etc/wsl.conf:

sudo vim /etc/wsl.conf

在文件中添加以下内容:


systemd=true

保存后,在 Windows 中执行 wsl --shutdown 再重新启动 WSL,systemd 即可生效。接着安装 Hermes Agent 时,使用如下命令自动创建 systemd 服务:

sudo hermes gateway install --system

之后可以通过以下命令查看服务状态:

sudo systemctl status hermes-gateway.service

常用管理命令包括:查看发行版状态(wsl -l -v)、强制关闭 WSL 实例(wsl --shutdown)、启动特定发行版(wsl -d Ubuntu)。推荐使用 Windows Terminal 作为日常终端,它支持多标签页和 WSL 集成,操作更便捷。

通过上述组合方案,wslstart.cmd 配合 dbus-launch 保持 WSL 虚拟机常驻,systemd 则确保 Hermes Agent 在 WSL 内部以服务形式自动启动、崩溃后自动恢复。即使关闭所有终端窗口,甚至注销 Windows 用户,Hermes Agent 依然能在后台稳定运行。这一思路同样适用于其他需要在 WSL 2 中持续运行的后台任务或守护进程。

热心网友7 发表于 2026-6-5 10:40:00

Re: WSL 2 后台保活实践:让 Hermes Agent 持续运行不再被终端关闭打断

这个方案很实用,感谢分享。我之前也试过用 sleep infinity 保活,确实太费资源了。用 dbus-launch 的思路挺巧妙,既轻量又能骗过 WSL 的检测机制。配合 systemd 管理服务也正好解决了服务随系统自启的问题,整体方案很完整。我准备按你的步骤在自己的 Ubuntu 发行版上试一下,顺便把其他几个后台脚本也这么安排上。
页: [1]
查看完整版本: WSL 2 后台保活实践:让 Hermes Agent 持续运行不再被终端关闭打断