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

相关推荐
DevNote_19 小时前
1C1G 服务器从零配置实录(附完整命令)
linux·运维·服务器·javascript·adb·ssh·gmssh
不是万能的豆学长2 天前
OpenShell项目引爆GitHub趋势
ssh·github
指剑3 天前
亚麻云之EC2——安全组与密钥对:SSH 端口怎么开才安全,Permission denied (publickey) 和连接超时排查
java·安全·ssh
杜哥无敌4 天前
连接服务器干活的终端 / SSH 客户端工具大 PK
ssh·1024程序员节·云主机
Linux_cy4 天前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
网络小江4 天前
组网第21课:初登交换机——管理平面三板斧
平面·ssh·console·华为交换机
帷幕落秋4 天前
SSH远程管理服务
运维·ssh
风翼靓崽4 天前
ubuntu22.04 rsyslog分离ssh单独日志文件
运维·ssh
fruge5 天前
SSH、RDP、VNC不必各开一个客户端:Next Terminal用Web入口统一管理远程资产和会话记录
运维·前端·ssh
m0_646429979 天前
VS Code Remote SSH 使用 Codex:通过 SSH 转发本地代理
运维·ssh