解决WSL关闭终端就会关机的问题

WSL2 本身要持续保持 Running,这样你在 WSL 里启动的 SSH Server 才不会因为 WSL 实例退出而断掉。

你现在的状态大概是:

text 复制代码
Windows
  │
  └─ WSL2
      │
      ├─ sshd  ← 你通过 SSH 连进来
      │
      └─ Shell
           │
           └─ Windows Terminal

关闭 Windows Terminal
        ↓
Shell 退出
        ↓
WSL 没有其它"活跃任务"
        ↓
WSL2 自动停止
        ↓
sshd 消失
        ↓
SSH 连接断开

你要的是

text 复制代码
Windows
  │
  └─ WSL2 ─────────────── Running
      │
      ├─ systemd
      ├─ sshd
      └─ 你的开发环境
             ↑
       Windows Terminal 只是入口

关闭 Windows Terminal
        ↓
Terminal 消失
        ↓
WSL2 仍然 Running
        ↓
SSH 继续可连接

最直接的解决方案

不要用 sleep infinity 这种临时保活。

如果你的 WSL 版本支持 systemd,推荐利用一个 systemd 服务 + WSL 启动机制 来做。

不过这里有一个关键点:

systemd ≠ WSL 永久 Running

很多教程会把这两个东西混在一起。

即使你:

ini 复制代码
[boot]
systemd=true

也只是让 WSL 启动后拥有 systemd。

如果:

text 复制代码
systemd
   ↓
没有需要运行的服务
   ↓
WSL 仍然可能被 WSL 自动终止

所以我们需要让 WSL 中始终存在一个后台服务。


我建议你现在这样做

先进入你的 WSL:

powershell 复制代码
wsl

执行:

bash 复制代码
ps -p 1 -o comm=

如果返回:

text 复制代码
systemd

很好,直接进入下面的步骤。

如果返回:

text 复制代码
init

那你找AI吧。


如果已经是 systemd

创建一个专门用于 WSL 保活的服务:

bash 复制代码
sudo nano /etc/systemd/system/wsl-keepalive.service

填入:

ini 复制代码
[Unit]
Description=Keep WSL instance alive
After=network.target

[Service]
Type=simple
ExecStart=/bin/sleep infinity
Restart=always

[Install]
WantedBy=multi-user.target

保存,然后:

bash 复制代码
sudo systemctl daemon-reload

启用:

bash 复制代码
sudo systemctl enable wsl-keepalive.service

启动:

bash 复制代码
sudo systemctl start wsl-keepalive.service

检查:

bash 复制代码
systemctl status wsl-keepalive.service

应该看到:

text 复制代码
Active: active (running)

然后测试

非常重要,别急着认为成功。

先退出 WSL:

bash 复制代码
exit

关闭 Windows Terminal。

然后重新打开 PowerShell:

powershell 复制代码
wsl -l -v

看看:

text 复制代码
NAME            STATE      VERSION
Ubuntu-24.04    Running    2

如果还是:

text 复制代码
Stopped

那就说明你的 WSL 环境还有另外一个问题,我们再处理。


SSH 这边还要确认一件事情

你现在 SSH 应该是类似:

text 复制代码
ssh user@你的Windows主机IP -p xxxx

或者:

text 复制代码
ssh user@localhost -p xxxx

如果 SSH Server 是运行在 WSL 里面,那么我们还要确保 sshd 本身是开机自动启动的。

如果你已经启用了 systemd:

bash 复制代码
sudo systemctl enable ssh
sudo systemctl start ssh

检查:

bash 复制代码
systemctl status ssh

应该是:

text 复制代码
Active: active (running)

这样最终就是:

text 复制代码
WSL启动
   ↓
systemd
   ├── ssh.service
   │     └── sshd
   │
   └── wsl-keepalive.service
         └── sleep infinity

即使没有任何终端连接:

text 复制代码
Windows Terminal
      ↓
     关闭
      ↓
     Shell退出
      ↓
WSL仍有 wsl-keepalive.service
      ↓
WSL保持 Running
      ↓
sshd继续运行
      ↓
SSH不会断

相关推荐
超级大福宝15 小时前
VS Code Remote-SSH 因 RemoteForward 端口冲突导致连接失败的排查与解决
运维·服务器·windows·vscode·ssh
Lucas_coding16 小时前
SSH 常见用法(四):使用 SCP 和 SFTP 远程传输文件
运维·ssh
酣大智1 天前
H3C MSR3600 交换机配置 SSH
网络·ssh·智能路由器
ai小陈4 天前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
寺中人4 天前
Xshell 完全入门指南:从安装到实战,远程连接+文件传输+会话管理全拆解
git·ssh·github·php·远程连接·xshell·运维工具
Julien20046 天前
Docker 网络(一)
linux·运维·服务器·ssh·学习方法
ggaofeng7 天前
精简版ssh(去掉认证和加密流程,更清晰的展示远程登录的底层实现)
运维·ssh
YumiProxy7 天前
服务器动态IP导致SSH频繁断连?从保活配置到自动重连的完整排查方案
服务器·tcp/ip·ssh
Julien20048 天前
CGroups 资源控制组
linux·运维·服务器·ssh·学习方法
ai小陈9 天前
GPU算力平台远程训练监控:TensorBoard与SSH隧道配置实战
运维·人工智能·深度学习·ai·ssh·gpu算力