解决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不会断

相关推荐
Databuff21 小时前
五款主流 SSH 免费工具介绍
运维·ssh·运维开发
程序员大阳2 天前
使用Putty登录阿里云Ubuntu ECS服务器方法
ubuntu·云计算·ssh·ecs·putty
ShiXZ2134 天前
SSH 客户端常用指令与配置速查手册
运维·ssh
我爱吃土豆15 天前
AI 编程工具远程开发指南:Codex 桌面版与 WorkBuddy 通过 SSH 连接云服务器实践
服务器·人工智能·ssh
进击的炸酱面6 天前
如何在服务器中使用codex?代理配置一图详解
ide·vscode·ssh
持敬chijing6 天前
VSCode 远程开发环境完整搭建指南:汉化、SSH 免密连接与版本更新锁定
ide·vscode·ssh
Databuff6 天前
PuTTY 工具的开源平替来了,免费使用
运维·开源·ssh·开源软件
Databuff7 天前
AI SSH工具,集齐SSH、SFTP、知识库RAG、AI助手
网络·人工智能·ssh
竣达技术7 天前
UPS 供电风险保护方案网络远程控制:免代理 SSH/Telnet UPS 安全关机方案
网络·安全·ssh