VSCode终端默认不保留进程,关窗即丢:其生命周期绑定窗口,关闭即终止所有进程;需用tmux替代实现会话持久化,配置profile自动进入命名会话,并注意分屏、工作目录及Remote-SSH适配。

VSCode终端默认不保留进程,关窗即丢
VSCode 内置终端的生命周期绑定编辑器窗口。一旦关闭窗口、重启 VSCode 或 SSH 断连,npm run dev、tail -f、后台 nohup 进程全都会被 SIGTERM 终止。这不是 bug,是设计使然——它本质是个“前端渲染器”,不管理会话持久性。直接依赖它跑长期任务,等于把服务绑在浏览器标签上。
用 tmux new-session -A -s 替代裸终端启动
核心思路:不让 VSCode 终端直接跑 shell,而是让它一打开就进 tmux 会话。这样终端只是“视图层”,真正运行的是后台 tmux server。
-
"terminal.integrated.profiles.linux"中定义新 profile,path指向bash(或zsh),args改为["-l", "-c", "tmux new-session -A -s code"] -
-A是关键:存在则 attach,不存在则创建,避免每次开终端都新建一堆会话 -
-s code统一会话名,方便脚本或远程复用;别用随机名,否则tmux ls里一堆0、1很难追踪 - Windows 用户若用 WSL,同样配
linux分组;原生 PowerShell 不支持 tmux,必须走 WSL2
分屏必须在 tmux 内做,VSCode 的 Ctrl+\ 只是视觉切分
VSCode 自带的分屏(Ctrl + \)只是多个独立 shell 实例,彼此无状态关联,也不能共享滚动缓冲、不能统一 detach。真要分屏管理,得进 tmux 后再操作:
- 进会话后按
Ctrl+b,松开再按%垂直分屏,按"水平分屏 - 每个窗格是独立 PTY,但共用一个会话生命周期:
Ctrl+b d一次 detach,整个会话(含所有窗格)后台保活 - 想让新终端自动进入已有 tmux 分屏布局?不行。VSCode 每次新开终端只执行一次
tmux new-session -A -s code,它不会还原你上次的窗格结构——tmux 本身也不存窗格布局到磁盘,除非你手动写tmuxinator或用resurrect插件 - 所以务实做法是:日常用
Ctrl+b %/"手动分,关键任务用命名窗格(Ctrl+b ,重命名)+Ctrl+b w切换,比记 layout 更可靠
Remote-SSH 下 tmux 是刚需,不是可选项
网络抖动、Wi-Fi 切换、笔记本合盖……这些都会让 Remote-SSH 连接断开。没有 tmux,docker logs -f、rails s 全部中断。配置要点很具体:
- 远程服务器必须装 tmux:
sudo apt install tmux(Ubuntu/Debian)或brew install tmux(macOS remote host) - VSCode 的 Remote-SSH 设置中,
terminal.integrated.defaultProfile.linux必须指向你配好的 tmux profile,不能留空或指回默认 bash - 不要在 tmux 里再套 screen 或其他复用器,嵌套会导致
SIGWINCH尺寸同步失败,窗格错位或光标乱跳 - 检查
~/.tmux.conf是否有set -g default-shell指向不存在的路径(比如误写成/bin/zshx),这会导致 attach 失败且无提示,只看到黑屏
最易忽略的一点:tmux 的 default-path 默认是 home 目录,但 VSCode 启动终端时的工作目录是 workspace root。如果没配 "terminal.integrated.splitCwd": "inherited",新分屏终端进 tmux 后 pwd 仍是 ~,不是你期望的服务目录——这个细节会让 cd backend && npm start 在右侧面板失效。


















