简短版:在远程机器上工作时,如何从 R 中重新启动丢失的 X11 连接?
长版:
- 设置
我使用 Mac 11.1 并连接到远程 Linux 服务器以在 R 中编码(通过Nvim-R)。我使用的步骤通常是:
ssh -Y login@remote.server
screen -r my_R_work_session
conda activate my_environment
nvim code.r
然后键入\rf
命令以在nvim
.
然后我可以在 R 中绘制任何东西(例如 with plot(iris)
)。该图在我的 Mac 上的外部窗口中弹出(通过X11
/ )。XQuartz
它通常在一开始就可以正常工作。
- 问题
但在某些时候,我可能会失去与服务器的连接一秒钟(互联网故障,vpn 停止......),当我恢复与服务器的连接时,一切似乎都正常(ssh
保持主连接)除了X11 连接。
此时,any 的输出plot(iris)
将是:
Error in .External2(C_X11, d$display, d$width, d$height, d$pointsize, :
unable to start device X11cairo
In addition: Warning message:
In function (display = "", width, height, pointsize, gamma, bg, :
unable to open connection to X11 display ''
- 解决方案(但正在寻找更好的东西!)
我目前找到的唯一解决方案是启动与服务器的新 ssh 连接并重新执行整个过程,直到启动 R 会话并绘制内容。有时,只关闭screen
会话有效,但我仍然需要重新加载conda
和我的R
会话。但这很耗时(而且很烦人),我猜可能会有更好的解决方案。
- 我也尝试过(但没有改变任何东西)
我发现很多帖子都在搜索这个错误,但仍然没有任何东西可以解决这个问题。
- 查看capabilities()
在失去 X11 连接之前,输出capabilities()
为:
jpeg png tiff tcltk X11 aqua
TRUE TRUE TRUE TRUE TRUE FALSE
http/ftp sockets libxml fifo cledit iconv
TRUE TRUE TRUE TRUE TRUE TRUE
NLS profmem cairo ICU long.double libcurl
TRUE TRUE TRUE TRUE TRUE TRUE
失去 X11 连接后,唯一的区别X11
是设置为FALSE
.
- 查看DISPLAY
参考这篇文章,我检查了DISPLAY
但一切似乎都很好。在终端中(在启动 R 之前或在 r 运行时):
> echo $DISPLAY
localhost:10.0
在 R 中:
> Sys.getenv("DISPLAY")
localhost:10.0
我尝试设置Sys.setenv("DISPLAY"=":0.0")
但没有任何区别。
-X11UseLocalhost
这篇文章建议更改X11UseLocalhost no
为X11UseLocalhost yes
in /etc/ssh/sshd_config
,但这对我没有任何影响。
-Xpra
最后,我尝试按照这篇文章Xpra
中的建议(可能是最有希望的建议)使用,但也没有任何区别。虽然在这里我不确定我是否正确使用它。这是我所做的:
[local] ssh -Y login@remote.server
[remote] screen -r xpra
[remote] xpra start :10
# exit screen
[local] xpra attach ssh:remote.server:10
[remote] screen -r my_R_work_session
[remote] conda activate my_environment
[remote] nvim code.r
非常感谢您的任何评论和帮助!