8、【Ubuntu】【VSCode】VSCode 断联问题分析
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
之前 blog
【OS】【Nuttx】【周边】效果呈现方案解析:VSCode 打开外部链接(一)
【OS】【Nuttx】【周边】效果呈现方案解析:VSCode 打开外部链接(二)
分析了 strace 日志中最后 browser.sh 和 code 命令的关系(之间并无联系,主要是通过 Node.js 执行脚本 server-cli.js,code 作为参数传入),但 browser.sh 脚本和 code 命令很像,差别只有一个 --openExternal
选项
后来又分析了下 vscode-client (browser.sh 启动 vscode-client 客户端) 连接 vscode-server 过程,以及信号链如何传递到 Windows VSCode 本地,下面分析个远程服务器上的一个 VSCode 断联问题
VSCode 断联问题
通过 VSCode Remote SSH 连接远程服务器可能经常遇到这种情况,远程服务器和 Windows VSCode 本地端突然断联,连接不上了,但是有时候重启又能恢复,下面来分析下断联问题的原因和解决方法
首先再说下背景,背景是承接之前 blog 分析的,第三方程序,比如下图的 browser.sh,试图通过 vscode-client 客户端和 vscode-server 主进程通过本地 socket 建立联系,以利用 SSH 隧道向 Windows VSCode 本地端法反向发送请求命令,结果在 vscode-client 和 vscode-server 建立联系的过程,出现了上述的失败问题
其实这个错误就是 strace 日志里面这条 connect
命令,只不过 strace 展示的 connect
命令是执行成功的
而这里是 connect
命令执行失败,并且将失败信息打印到了窗口上(成功的话,只能通过 strace 日志去追踪,终端无信息打印)
之前 blog 说过,这就是 VSCode 的进程间通信方式(IPC),通过本地 Socket 文件(也就是这里找不到的 vscode-ipc-*.sock
文件)进行通信,是的,这里直接点名是因为这个 socket 文件找不到
在终端输入
lsof /run/user/1000/vscode-ipc-*.sock
可以查看远程服务器中,所有连接 vscode ipc sokcet 的程序如下
解释下这里面的含义:
- 首先
COMMAND = node
表示这是 VSCode Server 的主进程(用 Node.js 写的),这里用which node
就能查出来该命令在 VSCode CLI 目录下(因为该 Shell 环境是 VSCode 打开的,VSCode 会将自己的 CLI 命令路径写到PATH
里面)CLI 表示 client,客户端的意思
USER = adminpc
表示用该用户名登录的 VSCode Remote SSH- 有多个 .sock 文件存在:表示有多个 VSCode Server 实例在运行,这些 socket 文件都会被 VSCode 实例监听
- 每个 socket 都处于 LISTEN 状态:表示 IPC 通道已建立,可以接受客户端连接,这里的客户端是指远程环境上的程序,参考之前 blog 【OS】【Nuttx】【周边】效果呈现方案解析:VSCode 打开外部链接(二) 上画的图,不是指 Windows VSCode 客户端
再说下 lsof
命令,终端输入
man lsof
可以查看 lsof
命令描述如下
首先,从其定义可以看出 lsof
命令是列出当前系统中被打开的文件,然后还要结合后面这段描述:列出被进程打开的文件的相关信息,当然这个进程作为使用者,也会作为文件的信息被打印出来,所以命令 lsof /run/user/1000/vscode-ipc-*.sock
也可以理解为列出所有正在使用(打开)了 VSCode IPC Socket 文件的进程,这样就能辅助定位本地 Socket 文件有没有在正常使用
ok,先到这里,下篇 blog 继续