如何在不退出远程服务器上的 R 的情况下恢复 X11 连接
How to recover X11 connection without exiting R on remote server
简短版:在远程计算机上工作时如何从 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 终端
然后我可以在 R 中绘制任何东西(例如 plot(iris)
)。该情节在我的 Mac 上的外部 window(通过 X11
/ XQuartz
)中弹出。它通常在开始时工作正常。
- 问题
但在某些时候,我可能会失去与服务器的连接一秒钟(互联网故障,vpn 停止......),当我恢复与服务器的连接时一切似乎都正常(主要ssh
保持连接)X11 连接除外。
此时,任何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
参考this post,我检查了DISPLAY
,但似乎一切正常。
在终端中(在启动 R 之前或当 r 为 运行 时):
> echo $DISPLAY
localhost:10.0
在 R 中:
> Sys.getenv("DISPLAY")
localhost:10.0
我尝试设置 Sys.setenv("DISPLAY"=":0.0")
但没有任何区别。
- X11UseLocalhost
This post建议在/etc/ssh/sshd_config
中将X11UseLocalhost no
改为X11UseLocalhost yes
,但对我来说没有任何区别。
- Xpra
最后,我按照 this post 的建议(可能是最有前途的建议)尝试使用 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
非常感谢您的评论和帮助!
对于碰到这个 post 的任何人,我最终找到了一个超级简单的解决方案:您只需要在当前会话的同时启动一个新的 ssh -Y
连接。然后你可以将当前会话中的DISPLAY
参数重定向到新连接中的值。
这里有一个更详细的例子。
在当前会话中(在开始新的 ssh 连接之前),如果您在 R
终端中尝试:
> capabilites() # returns X11 = FALSE
> Sys.getenv('DISPLAY') # returns localhost:xx.0
localhost:12.0
> x11('localhost:12.0') # returns error message
现在您并行启动新的 ssh 连接:ssh -Y login@remote.server
。您需要在这个新会话中找到 DISPLAY
的值,例如:
在bash中:
$ echo $DISPLAY
localhost:13.0
或在 R 中:
> Sys.getenv('DISPLAY')
localhost:13.0
最后在原来的R终端中,将DISPLAY
参数设置为新的连接值:
> Sys.setenv('DISPLAY' = 'localhost:13.0')
> x11('localhost:13.0') # or x11() - both should work
还有一个办法,就是修改ssh配置文件中ForwardX11Timeout
的值(~/.ssh/config
)。它通常默认设置为 ~20 分钟(请参阅 man ssh
)。您可以尝试将此设置为一天(或更多),例如:ForwardX11Timeout 1d
。如果打开时间少于 24 小时,这将防止 X11
在任何工作会话期间停止。您甚至可以在此配置文件中设置 ForwardX11Trusted yes
。但是,这些选项可能会导致安全漏洞,因此需要谨慎考虑。
简短版:在远程计算机上工作时如何从 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 中绘制任何东西(例如 plot(iris)
)。该情节在我的 Mac 上的外部 window(通过 X11
/ XQuartz
)中弹出。它通常在开始时工作正常。
- 问题
但在某些时候,我可能会失去与服务器的连接一秒钟(互联网故障,vpn 停止......),当我恢复与服务器的连接时一切似乎都正常(主要ssh
保持连接)X11 连接除外。
此时,任何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
参考this post,我检查了DISPLAY
,但似乎一切正常。
在终端中(在启动 R 之前或当 r 为 运行 时):
> echo $DISPLAY
localhost:10.0
在 R 中:
> Sys.getenv("DISPLAY")
localhost:10.0
我尝试设置 Sys.setenv("DISPLAY"=":0.0")
但没有任何区别。
- X11UseLocalhost
This post建议在/etc/ssh/sshd_config
中将X11UseLocalhost no
改为X11UseLocalhost yes
,但对我来说没有任何区别。
- Xpra
最后,我按照 this post 的建议(可能是最有前途的建议)尝试使用 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
非常感谢您的评论和帮助!
对于碰到这个 post 的任何人,我最终找到了一个超级简单的解决方案:您只需要在当前会话的同时启动一个新的 ssh -Y
连接。然后你可以将当前会话中的DISPLAY
参数重定向到新连接中的值。
这里有一个更详细的例子。
在当前会话中(在开始新的 ssh 连接之前),如果您在 R
终端中尝试:
> capabilites() # returns X11 = FALSE
> Sys.getenv('DISPLAY') # returns localhost:xx.0
localhost:12.0
> x11('localhost:12.0') # returns error message
现在您并行启动新的 ssh 连接:ssh -Y login@remote.server
。您需要在这个新会话中找到 DISPLAY
的值,例如:
在bash中:
$ echo $DISPLAY
localhost:13.0
或在 R 中:
> Sys.getenv('DISPLAY')
localhost:13.0
最后在原来的R终端中,将DISPLAY
参数设置为新的连接值:
> Sys.setenv('DISPLAY' = 'localhost:13.0')
> x11('localhost:13.0') # or x11() - both should work
还有一个办法,就是修改ssh配置文件中ForwardX11Timeout
的值(~/.ssh/config
)。它通常默认设置为 ~20 分钟(请参阅 man ssh
)。您可以尝试将此设置为一天(或更多),例如:ForwardX11Timeout 1d
。如果打开时间少于 24 小时,这将防止 X11
在任何工作会话期间停止。您甚至可以在此配置文件中设置 ForwardX11Trusted yes
。但是,这些选项可能会导致安全漏洞,因此需要谨慎考虑。