如何在VSCode关闭后仍保持.ipynb文件后台持续运行?
核心原因
底部状态栏显示Jupyter: Server Remote只代表你给插件配过远程服务器地址,不代表你当前打开的notebook真的在用这个远程服务的内核。VS Code Jupyter插件默认优先拉起和当前窗口生命周期绑定的临时内核,关窗口时会自动回收这些临时内核的进程,这就是你关VS Code就显存清空的根本原因——你跑代码用的内核从一开始就不是你tmux里起的那个常驻Jupyter服务拉起来的。
快速验证方法:切回你启动Jupyter的tmux窗口翻服务日志,你在VS Code里跑单元格的时候如果没有新的内核连接、启动记录,就实锤是用了临时内核。
可复现的解决步骤
- 先把Jupyter服务本身配成真正常驻:tmux进会话后用下面的命令启动,不要乱加多余参数:
jupyter notebook --no-browser --port=8888 --ip=127.0.0.1 --NotebookApp.token='固定自定义token'
启动后按Ctrl+B再按D退出tmux会话(不要直接关窗口杀进程),先用浏览器访问http://127.0.0.1:8888?token=你设的固定token,确认能正常打开、新建notebook跑代码占显存,关浏览器后显存不释放,先把服务本身的常驻性验证通过,再搞VS Code配置。 - 打开VS Code,按
Ctrl + Shift + P搜索Jupyter: Clear Jupyter Server List,把之前存的错的、过期的服务器配置全清掉。 - 再按
Ctrl + Shift + P选Jupyter: Specify Jupyter Server for connections,选择「连接到现有Jupyter服务器」,手动填你刚才验证过的带token的完整地址,一路点确认,等插件提示连接成功。 - 90%的人漏这步:打开目标.ipynb文件,点编辑器右上角的内核选择按钮,不要选任何带「本地」「Python环境」标签的内核,下拉找到你刚连的远程Jupyter服务条目下挂的内核(会明确标远程服务地址),选中后等内核状态显示为已连接。
- 做最终校验:在notebook单元格里执行
!pstree -s $PPID,看输出的进程树父节点是不是你tmux里启动的Jupyter进程,如果父节点里带code(VS Code进程),说明还是选到了临时内核,回去重选。 - 本地连本地启动的Jupyter不需要配端口转发,如果是连远程服务器上的Jupyter,端口转发固定映射本地127.0.0.1:8888到远程127.0.0.1:8888,不要用随机端口。
常见坑
- 配完远程服务器地址不要直接跑代码,VS Code不会自动切换内核,默认还是拉本地临时内核,关窗口必被杀。
- 如果内核选择下拉里看不到远程服务的内核,说明你填的服务地址、token不对,直接去tmux里看Jupyter启动日志打印的完整访问链接,复制过来填,不要自己拼路径。
- tmux启动Jupyter前不要开自动退出会话杀进程的配置,detach tmux后可以先断一次SSH重连,确认Jupyter进程还在、端口还在监听,再去VS Code连。

内容的提问来源于stack exchange,提问作者cccrick
相关产品推荐
相关产品推荐

