16、【Ubuntu】【VSCode】VSCode 断联问题分析:问题解决

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【VSCode】VSCode 断联问题分析:UID 补充

最后补充了下 UID 的说明,下面回归问题本身

VSCode 断联问题

回归问题本身

首先,这里是尝试用 xdg-open 命令去打开一个链接,前面一系列 blog 【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(十一) 分析了由于是 SSH 客户端远程登录,没有桌面应用可以用来打开链接,此时检测到当前环境为 VSCode Server,便尝试用 VSCode IPC Socket 与 VScode 主进程取得联系,想通过 SSH 隧道反向从 Windows 打开该链接,然后结果在连接 VSCode IPC Socket 时出了问题,发现连接不上了

然后用 lsof 命令查询当前登录用户下,已建立的 Socket 通信,发现有如下这些

虽然这里有很多 Socket 文件,却没有报错中提到的以 aed2 结尾的 Socket 文件

从这儿可以得出一个结论:当远程的 VS Code Server 试图通过本地 IPC Socket 与主进程通信,但这个 IPC Socket 文件不存在

这个 IPC Socket 文件命名来源于环境变量 VSCODE_IPC_HOOK_CLI ,在终端输入

bash 复制代码
echo $VSCODE_IPC_HOOK_CLI

可以打印出当前终端所使用的 VSCode IPC Socket 如下(问题出现时的环境太久已经被破坏了,现在是新的环境,不影响分析说明)

关于 VSCODE_IPC_HOOK_CLI 提几个点:

  • 首先,VSCODE_IPC_HOOK_CLI 是与终端会话相关 的环境变量,不是全局的 ,只在通过 VS Code Remote-SSH 启动的终端中被设置,并且只对那个终端及其子进程有效,比如上面那个终端的 Socket 文件是以 9689 结尾的,如果再新建一个新的 Bash Shell

    再打印,可以看到就是一个全新的 Socket 文件了
  • 另外,VSCODE_IPC_HOOK_CLI 是由 VSCode 的远程服务器组件(VSCode-Server) 在客户端通过 Remote-SSH 插件连接,或新建终端时 ,动态注入到集成终端的启动环境中的,VSCode-Server 会为每个特定终端会话创建一个唯一,临时的 Socket 文件,并将这个 Socket 文件的路径再通过环境变量 VSCODE_IPC_HOOK_CLI 写入到该终端进程的环境中,然后 VSCode 就可以使用这个 Socket 文件与该终端内的进程进行双向通信

VSCODE_IPC_HOOK_CLI 指向一个不存在的的 Socket 文件路径,说明这个终端曾经通过 VS Code Remote-SSH 连接过,VSCode-Server 注入了这个变量,但后来 VSCode-Server 与 Windows VSCode 远程客户端断开了连接,这个终端的 Socket 文件被删除,但 Shell 还在运行(Shell 进程本身被设计为在断开后继续运行,防止意外中断长时间运行的任务,影响用户体验 ),环境变量仍然保留在内存中,这就是残留环境变量问题 ,相当于现在的终端是一个僵尸会话:该终端保留着旧的环境,但对应的 IPC 通道已经不存在了

所以解决办法就是关闭原来的 Shell 进程 ,比如主动输入命令 exit ,或者光标操作删除终端

然后退出 Windows VSCode 客户端,然后重新进入 ,就可以用新的 IPC 通道进行通信了,或者直接新建个终端也是可以的

当然,未来这个 BUG 也可能被修复掉,通过终端生命周期管理,


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【远程开发】技术方案分析:公私网ip

相关推荐
ouynagda5 分钟前
嵌入式Linux i.MX6ULL系统移植学习笔记
linux·笔记·学习
NightReader9 分钟前
PVE 环境部署
linux
蚰蜒螟16 分钟前
一次挂载的完整旅程:Linux 内核 VFS 到 ext4 的调用链剖析
linux·运维·服务器
天蓝蓝的本我33 分钟前
linux本地部署Qwen3.8 27B
linux·运维·excel
lisanmengmeng1 小时前
NRPE 添加命令(四)
linux·运维·服务器
想做小南娘,发现自己是女生喵1 小时前
i.MX6ULL嵌入式Linux入门学习文档
linux·运维·学习
此生决int2 小时前
Linux系列(04)——基础开发工具(上)软件包管理器、vim、gcc/g++
linux·服务器·vim
Huangjin007_2 小时前
【Linux 系统篇(二十六)】文件(三): 深入理解 “一切皆文件”、缓冲区
linux·运维·服务器
我不会起名字3222 小时前
Redis 入门(一):Redis 是什么,为什么后端都离不开它
linux·redis·docker·安装·cli
Huangjin007_3 小时前
【Linux 系统篇(二十七)】文件(四):Ext 系列文件系统(上):从物理磁盘到逻辑抽象
linux·运维·服务器