必须先kill残留进程再删远程.vscode-server目录,否则文件可能被锁、日志持续写入,导致下次连接复用损坏状态或报cannot find module 'vs/server/main'错误。

删远程 .vscode-server 目录前必须 kill 掉残留进程
直接 rm -rf ~/.vscode-server 很可能删不干净,因为 VS Code Remote-SSH 断开后,node 或 code-server 进程常在后台继续运行,锁住文件或持续写日志。不先终止它们,下次连接仍会复用损坏状态,甚至出现 Cannot find module 'vs/server/main' 错误。
- 先查进程:
ps aux | grep vscode-server | grep $USER(注意过滤掉grep自身) - 再精准杀掉:
kill -9 $(ps aux | grep vscode-server | grep $USER | grep -v grep | awk '{print $2}') - 验证是否清空:
pgrep -f "vscode-server\|code-server" | wc -l返回0才算成功
只删 ~/.vscode-server/bin/ 下非 current 的 commit 目录
~/.vscode-server/bin/ 里每个子目录都是一个 40 位 commit hash(如 a1b2c3d...),当前正在用的版本通过软链接 current 指向它。历史版本不会自动清理,长期积累可占数 GB——但直接全删 bin/ 会导致下次连接失败,因为 current 链接会失效。
- 先确认当前指向:
ls -l ~/.vscode-server/bin/current - 再安全清理旧版:
find ~/.vscode-server/bin -mindepth 1 -maxdepth 1 -type d ! -name "$(basename $(readlink ~/.vscode-server/bin/current))" ! -name "current" -exec rm -rf {} + - 别忘了
~/.vscode-server/data/Machine/:这是扩展缓存目录,不删不影响连接,但占空间,可一并rm -rf ~/.vscode-server/data/Machine
本地和远程必须同步清理,否则连接仍失败
VS Code Remote-SSH 是“两端协商”机制:本地插件决定该拉哪个 commit 版本,远程目录决定实际跑哪个二进制。只清一边,比如只删远程 .vscode-server,本地缓存仍会触发下载旧版;只清本地,远程残留的旧 code-server 可能因签名不匹配被新客户端拒绝启动。
- 本地路径(Windows):
%USERPROFILE%\.vscode-server - 本地路径(macOS/Linux):
~/.vscode-server - 远程路径(统一):
~/.vscode-server(注意不是~/vscode-server或/tmp/vscode-server) - 删完立刻重启 VS Code,不要手动 ssh 进去 chmod 或解压——让插件自己走完整流程
下载慢或 404?换源或手动部署要严格对齐路径
官方 CDN update.code.visualstudio.com 在国内常超时或返回 404,表现为卡在 Downloading VS Code Server。换源不是简单改 URL,必须保证 code-server 二进制最终落在 ~/.vscode-server/bin/<commit-id>/bin/code-server</commit-id>,否则启动报错 Cannot find module 'vs/server/main'。
- 临时生效(仅本次连接):在 VS Code 设置中给
remote.SSH.env加键值对:"VSCODE_AGENT_FOLDER": "https://npmmirror.com/mirrors/code-server"(注意路径末尾不能带斜杠) - 手动部署:下载对应 commit ID 的
vscode-server-linux-x64.tar.gz,解压后把整个vscode-server文件夹放进~/.vscode-server/bin/<commit-id></commit-id>,再执行chmod +x ~/.vscode-server/bin/*/bin/code-server
code-server 的签名哈希,若本地与远程 commit ID 不一致(比如你手动删了远程但没清本地),它不会提示“版本不匹配”,而是静默失败或卡在安装阶段。务必两端同步动作,且确保没有残留进程干扰。











