远程服务器上持续使用Jupyter Notebook

26

我使用ssh -L连接到远程服务器,但如果我关闭笔记本盖子或连接中断,则 Jupyter 笔记本将断开连接。

重新连接到远程服务器后,“上一个”会话将丢失。

有什么方法可以使它持久化? screen 可以帮助解决这个问题吗?


实际应用中,长时间运行的笔记本会失败。我的建议是将笔记本转换为脚本,然后像@MichaelD建议的那样使用screen运行它。我知道这不能回答OP的问题,但它将解决他们的问题。 - shallow_water
5个回答

36

在远程服务器上,您应该在screen会话中打开您的jupyter,这将使它在与服务器失去连接时仍然保持持久性。

  1. 在本地计算机上: ssh -L xxxx:localhost:yyyy server
  2. screen
  3. jupyter notebook --no-browser --port=yyyy。【在远程服务器上】
  4. 在您的浏览器中: localhost:xxxx

手动断开连接并重新连接:

  1. 退出屏幕窗口:Control + a,然后按d
  2. 从服务器断开连接:Control + d
  3. 再次连接:ssh -L xxxx:localhost:yyyy
  4. 可选地,您可以重新打开屏幕窗口,尽管不必要,使用screen -r
  5. 返回您的笔记本或重新打开localhost:xxxx

1
重新连接,您只需使用 ssh -L xxxx:localhost:yyyy server 重新连接到远程服务器即可。如果您想访问正在运行jupyter的屏幕,则可以执行 screen -r。请注意,重新连接到远程服务器就足够了,您不必重新打开屏幕。 - BiBi
1
我使用tmux来持久运行程序。 - Jingpeng Wu
1
什么是xxxxyyyy?你能解释一下要分配的端口吗? - maninekkalapudi
1
基本上,您应该在本地机器(xxxx)和远程机器(yyyy)上使用未使用的端口。例如,xxxx可以是8888,而yyyy也可以是8888 - BiBi

11

持久化Jupyter服务器会话的标准用法是在具有IP地址xx.xx.xx.xx的远程服务器上使用nohup&

nohup jupyter notebook --no-browser --ip xx.xx.xx.xx --port yyyy &

现在,即使您关闭笔记本电脑或失去连接,只要将浏览器指向xx.xx.xx.xx:yyyy,您就可以始终重新连接。


如何选择 xx.xx.xx.xx - Michael D
@MichaelD 这应该是您服务器机器的IP地址。 - desertnaut
我尝试了它,但对我没有起作用。(我在本地机器上运行 nohup ... - Michael D
它对我没用。可能是因为服务器在本地网络中...(以10.xx开头) - Michael D
@MichaelD 不应该是问题 - 我的也在本地网络中(以192.xx..开头); 你在服务器上使用了 ifconfig 命令来获取它的IP地址吗? - desertnaut

1

在@BiBi的回答中补充一点...

我可以推荐你使用tmux,而不是screen。特别是,如果你将tmux与Tmux Plugin Manager结合起来,并安装Tmux Resurrect, 即使远程服务器重新启动后,你也能够回到之前的Tmux会话。

tmux的快捷键与screen的相似,只是control + a被替换为control + b。当然,tmux允许你配置自定义快捷键。


0

使用nohup命令在退出shell或终端后保持jupyter运行。 在指定的位置键入以下命令。

  1. 在远程服务器中,键入以下命令 nohup jupyter notebook --no-browser --port=8085 > my.log 2>&1 < /dev/null &。 这将在端口8085上运行jupyter,任何stdout都将存在于my.log
  2. 在本地,键入以下命令 ssh -NL 8085:localhost:8085 username@xx.xx.xx.xx 。 如果需要指定端口,可以使用ssh -NL 8085:localhost:8085 -p xxxx username@xx.xx.xx.xx
  3. 在浏览器中打开 http://127.0.0.1:8085/

有时远程服务器上可能会占用端口8085,在这种情况下,请尝试使用另一个端口,但确保在进行隧道连接时使用相同的端口号。


0

BiBi的回答是正确的。但我遇到过这样的情况,我的ssh连接意外终止,当我尝试重新连接时,端口转发不再起作用。可能是远程机器上有一些悬挂的进程,不确定。

无论如何,在这些情况下,我使用socat在远程机器上代理两个本地端口:

# jupyter notebook/lab running in screen on port yyyy, then your connection dies...
ssh -L xxxx:localhost:zzzz
socat tcp-listen:zzzz,reuseaddr,fork tcp:localhost:yyyy

这样你就可以避免在不同端口上重新启动jupyter了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接