解决在vscode中使用wakatime记录jupyter时间问题

解决在vscode中使用wakatime记录jupyter时间问题

Tags
IT
经验
解决问题的日志记录
Published
February 7, 2023
Author
Dario Zhang

背景

使用wakatime记录项目时间时,发现其不支持jupyter,也无法识别浏览器中打开的jupyterlab。最初的解决方案是在wakatime中写rules来识别语言和活动,但具体到页面内的项目和代码就没有办法了。于是开始尝试vs code连接jupyter来做实验。

问题一:无法连接vultr服务器,报错连接超时

尝试过无效的方案

  • 清空known_hosts文件、删除remote的.vscode-server文件夹。
  • 增加超时判断时间,从15s到30s再到60s
  • 将绝对文件路径添加到自定义SSH配置文件(C:\Users\{用户名}\.ssh\config)
  • 修改设置里的local server控制项
    • "remote.SSH.showLoginTerminal": true, "remote.SSH.useLocalServer": false

解决方案1

发现另一个bandwagon的服务器可以正常连接,所以萌生用bandwagon服务器做跳板机的想法,
生成新的公钥,并将公钥复制到跳板机和目标服务器~/.ssh/authorized_keys中
ssh-keygen -t rsa -b 4096
修改remote ssh的配置文件如下:
Host JumpMachine #跳板机名称 HostName XXX.XXX.XXX.XXX #跳板机IP Port XXX #跳板机ssh端口 User root #跳板机用户名 Host TargetMachine #远程服务器名称 HostName XXX.XXX.XXX.XXX #远程服务器IP Port XXX #远程服务器ssh端口 User root #远程服务器用户名 ProxyCommand ssh -W %h:%p JumpMachine
在vscode中尝试登陆,在命令面板中输入:ssh 用户名@目标服务器ip

解决方案2

同样是用 remote-ssh 中 ProxyCommand的方式,但借用git的connect程序直接走代理,不通过跳板机。connect.exe的具体地址需要自己搜索。
ProxyCommand D:\Program Files\Git\mingw64\bin\connect.exe -H 127.0.0.1:10809 %h %p

问题二:vs code打开jupyter notebook,调用远端kernel

增加VPS虚拟内存

之前用浏览器打开jupyter时,内核自动重启过,猜想是因为任务占用内存太高的缘故,VPS只有1G的物理内存,不够用,需要增加虚拟内存。
# 查看Swap分区大小 free -h
一般初始swap是0,如果已经设置过,要增加只能先删除原有的
total used free shared buff/cache available Mem: 976Mi 720Mi 74Mi 1.0Mi 181Mi 102Mi Swap: 4.0Gi 1.6Gi 2.4Gi
# 删除Swap交换分区 swapoff -a # 创建swap分区的文件, of后的目标文件自定义,要放到比较大的盘里,可以 df -h 查看空闲较多的盘。 # if表示input_file输入文件,of表示output_file输出文件, # bs表示block_size块大小,count表示计数。数据块大小为1M,数据块数目为2048,这样分配的空间就是2G大小。 dd if=/dev/zero of=${target_swapfile} bs=1M count=2048 # 格式化交换文件 mkswap ${target_swapfile} # 挂载交换文件 swapon ${target_swapfile}
/etc/fstab文件中加入如下命令,开机自动加载
${target_swapfile} swap swap defaults 0 0

kernel问题

连接remote后,用screen在后台启动jupyter server。在remote安装vscode的jupyter扩展,搜索remote jupyter server命令,指定一个本地或者远程的jupyter服务连接,这里因为已经ssh连接了remote,所以可以用http://localhost:8888/lab这个url,注意不能是https,因为jupyter启动后console里给的链接就是http。
填好后打开一个remote的jupyter notebook,一般会自动选择刚才指定的kernel,但是运行cell时才正式连接kernel。可能是因为用了跳板机,执行速度非常慢,但至少能跑程序了,原先指定远程jupyter服务连接时直接无法连接kernel。
💡
通过vscode remote打开的jupyter notebook,内核不会自动关闭,需要在浏览器的jupyterlab中手动关闭内核。

在 VSCode Jupyter 中使用 console

# 1. 打开一个 notebook,在 cell 里运行 %connect_info # 2. 把返回的数据保存为 console.json 文件 # 3. 安装 jupyter-console(若已安装,跳过) pip install jupyter-console # 4. 打开一个终端,运行 jupyter console --existing console.json # 得到一个当前 notebook 的 console

wakatime 找不到token的问题

连接remote后,需要在remote安装wakatime扩展,但扩展初始化时会报错,查看日志后发现是未找到token的原因,官方在issue说已经解决远程问题,但我仍然报错了。
在本地机器找到token所在的.wakatime.cfg文件,拷贝到连接remote时指定的初始文件夹,再启动wakatime时成功。
至此,问题解决。

后记

通过在remote使用vscode的wakatime插件,是否能准确记录jupyterlab的使用时间和解析项目名,目前还不知道,因为github readme中用action读取的wakatime stats一直未更新,可能需要明日再看结果。