VSCode集成终端断连即杀进程,必须用tmux实现持久化;需配置terminal.integrated.profiles.linux强制启动命名tmux会话(如code),断线后执行tmux attach -t code恢复。

VSCode 集成终端本身不保存会话状态,断连即丢进程——所谓“自动保持”,必须靠 tmux 或 screen 实现,且需强制终端启动时就进入会话,不能靠手动补救。
为什么 VSCode 终端一断就连带杀掉所有进程
集成终端不是独立 shell 进程,而是 VSCode 渲染层绑定的前端通道。一旦 SSH 连接中断、窗口关闭或网络切换,它会向子进程发送 SIGHUP,python train.py、npm run dev、tail -f logs.txt 全部终止。
用 nohup 或 & 只能保住进程,但丢失输出流、无法交互、无法恢复多任务上下文——对训练、调试、日志监控毫无实用价值。
-
remote.SSH.keepAlive对终端进程完全无效:它只管 UI 控制通道,不发任何网络包,也不影响子进程生命周期 -
remote.autoReconnect是“连接断了再试”,但终端进程在断连瞬间已被杀,重连后只剩空壳 - 不配
tmux,就没有真正的会话持久化;所有“自动恢复”都是错觉
必须改 terminal.integrated.profiles.linux 强制启动 tmux 会话
目标是每次点「+」新建终端,都自动进入一个命名 tmux 会话(如 code),而不是裸跑 bash 或 zsh。
打开 VSCode 设置(Ctrl + ,),搜索 terminal.integrated.profiles.linux,点击「Edit in settings.json」,添加如下配置(路径按你实际 shell 调整):
{
"terminal.integrated.profiles.linux": {
"bash": {
"path": "/bin/bash",
"args": ["-c", "tmux new-session -A -s code"]
}
}
}
- 必须用
-A -s code:确保每次进的是同一个会话,不是新建一堆临时会话 - 不要写成
tmux attach || tmux new:竞态条件下可能失败,-A更健壮 - 如果远程默认 shell 不是
/bin/bash(比如是/usr/bin/zsh),要同步改path
远程服务器上 tmux 必须可运行且配置合理
VSCode 终端启动时执行 tmux new-session,前提是远程已装 tmux 且权限正常。
- 检查是否安装:
which tmux;没装就运行sudo apt install tmux(Debian/Ubuntu)或sudo yum install tmux(CentOS/RHEL) - 确认
~/.tmux.conf至少启用鼠标支持:set -g mouse on,否则滚动、选中、分屏难操作 - 若遇到
open terminal failed: spawn ENOENT,大概率是tmux路径不对或未加入$PATH,可在~/.bashrc中加export PATH="$HOME/.local/bin:$PATH"并重载
断线后怎么恢复?只需两步
网络恢复、VSCode 重连成功后,终端里不会自动回到之前 tmux 会话——你看到的是一个新 shell 窗口。此时手动执行:
tmux attach -t code
- 只要没手动
tmux kill-session -t code或服务器重启,会话和所有进程都还在后台运行 -
tmux ls可查看当前有哪些会话;tmux kill-session -t oldname可清理废弃会话 - 别依赖
tmux attach默认行为:它可能 attach 到别的会话,务必用-t code显式指定
真正麻烦的从来不是配置,而是第一次断连后忘了 tmux attach -t code ——进程其实一直活着,只是你没找对门。


















