我在守护进程模式下运行 emacs,但与运行它的服务器断开了连接。重新连接后,当我运行时
emacsclient -nc
我收到错误
连接本地主机端口 6012:连接被拒绝
错误:显示localhost:12.0打不开
该守护进程似乎仍在运行,但我不知道如何连接到它,有什么建议吗?
其他有趣的事实,可能相关也可能不相关:
我通过屏幕会话连接到头节点,然后连接到服务器的另一个侧节点。
我已经运行这个设置几天了,通常我能够毫无问题地重新连接。
我确信我可以重新启动守护进程,但我想恢复工作会话,因为它连接到正在运行的 matlab 作业,我通过 matlab-emacs 与之交互。
编辑:我尝试了吉尔斯的建议,但仍然遇到问题
echo $DISPLAY
回报
本地主机:18.0
我进入屏幕会话并运行
export DISPLAY=localhost:18.0
甚至在屏幕会话中再次运行 echo $DISPLAY
本地主机:18.0
现在 emacsclient -nc 返回
错误:显示localhost:18.0打不开
现在,运行屏幕会话的计算机正在使用相同的显示器,但仍然没有连接。
请注意,我也尝试过
export display=localhost:18
edit2:关于我的系统架构的说明我办公室的笔记本电脑通过 ssh 连接到服务器“host1”。 host1 有多个节点计算机。我首先创建或登录屏幕会话
screen -S ohnoplus-five
然后连接到node005
ssh node005
然后我从屏幕上分离,而不注销 node005 并重新附加
屏幕-r ohnoplus-5
来自主机1
为了响应 Gills 的建议,我运行了 export DISPLAY=localhost18.0,这是由 echo $DISPLAY 在 host1 上返回的显示,而不是我的本地笔记本电脑。
答案1
远程 GUI (X11) 连接通过 TCP 端口 6000+n在哪里n是显示编号。因此,这两条消息指的是同一问题:某些程序尝试连接到显示器 12 但失败。
Emacsclient 不建立 X11 连接,而 Emacs 则建立。因此,如果您看到此消息,则意味着 Emacsclient 设法联系 Emacs 并告诉它打开一个新框架。如果 Emacsclient 认为 X11 显示器可用,则请求 GUI 框架,否则请求终端框架。设置环境变量后DISPLAY
,Emacsclient 认为 X11 显示可用。
DISPLAY
当 SSH 将 X11 连接转发回本地计算机时,环境变量会由 SSH 自动设置。但是,当您附加到现有的 Screen 会话时,您将获得在 Screen 会话内设置的环境,包括变量DISPLAY
。如果您断开连接并重新连接,则无法保证显示编号相同²。
要更新DISPLAY
变量,请从 Screen 会话中分离,运行echo $DISPLAY
以查看 SSH 设置的值(例如localhost:13
),然后重新连接到 Screen 会话并运行export DISPLAY=localhost:13
(或任何正确的数字)。如果屏幕会话中有多个窗口,则需要在每个窗口中执行此操作。如果您创建新窗口,请键入Ctrl+ A :setenv DISPLAY localhost:13`Enter以在 Screen 本身中设置环境变量,以确保新窗口的正常运行。
如果您愿意,可以通过取消设置DISPLAY
或运行来打开终端框架emacsclient -nw
。
1 SSH 使用从 10 开始的显示编号,仅将数字 0-9 留给本地显示。在典型情况下,显示 12 意味着这是通过 SSH 打开的第三个 GUI 连接。
²事实上,如果您由于网络问题而断开连接,但很快又重新连接,那么远程计算机很可能还没有注意到网络问题——它只知道客户端发送任何内容已经有一段时间了,但是这只是正常的不活动——在这种情况下,就远程计算机而言,显示器 12 仍在使用中。
如果有多个 SSH 跳,并且从本地机器到中间机器的连接中断并恢复,则恢复后,中间机器上的显示编号已更改,但从中间机器到最终机器的 SSH 连接仍然存在转发原始显示号码。
在这种情况下,最简单的方法是仅在最终计算机上运行 Screen,并使用中间计算机作为代理人。添加
Host node[0-9]*
ProxyCommand ssh -W %h:%p host1
到你的~/.ssh/config
并运行ssh node005
。那么你就不用担心中间机器了。
如果必须在中间计算机上运行 Screen,则必须在更新变量后重新启动从 host1 到 node005 的 SSH 连接DISPLAY
。 (您还可以将 TCP 连接从旧显示号码转发到新显示号码,但这仅在旧显示号码在此期间未被重用的情况下才有效。)