我正在远程 Debian Jessie 服务器上工作。我已启动屏幕会话,开始运行脚本,然后因网络超时而断开连接。
现在我已再次登录并想要恢复会话。
这是我在列出屏幕时看到的内容:
$ screen -ls
There are screens on:
30608.pts-8.myserver (11/03/2015 08:47:58 AM) (Attached)
21168.pts-0.myserver (11/03/2015 05:29:24 AM) (Attached)
7006.pts-4.myserver (10/23/2015 09:05:45 AM) (Detached)
18228.pts-4.myserver (10/21/2015 07:50:49 AM) (Detached)
17849.pts-0.myserver (10/21/2015 07:43:53 AM) (Detached)
5 Sockets in /var/run/screen/S-me.
我似乎同时连接到两个屏幕。
现在我想恢复之前运行的会话,以查看脚本的结果:
$ screen -r 30608.pts-8.myserver
There is a screen on:
30608.pts-8.OpenPrescribing (11/03/2015 08:47:58 AM) (Attached)
There is no screen to be resumed matching 30608.pts-8.myserver.
为什么我无法重新连接?
我的另一个屏幕也有同样的问题:
$ screen -r 21168.pts-0.myserver
There is a screen on:
21168.pts-0.OpenPrescribing (11/03/2015 05:29:24 AM) (Attached)
There is no screen to be resumed matching 21168.pts-0.myserver.
答案1
该会话仍附加在另一个终端上。服务器尚未检测到该连接上的网络中断:它仅在尝试发送数据包并在超时后收到错误或无响应时检测到中断,但这还没有发生。您遇到的常见情况是,客户端检测到中断,因为它尝试发送一些输入但失败,但服务器只是坐在那里等待输入。最终服务器将发送一个保活数据包并检测到连接已断开。
同时,使用该-d
选项将屏幕会话与其所在的终端分离。
screen -r -d 30608
screen -rd
几乎是附加到现有屏幕会话的标准方法。
答案2
根据手动的你只能“恢复”超然的屏幕:
'
-ls
[匹配]'
'-list
[匹配]'
不要启动 screen,而是打印会话标识字符串列表(通常采用 pid.tty.host 形式;请参阅会话名称)。标记为“分离”的会话可以通过以下方式恢复screen -r
。那些标记为“附加”的正在运行并且有一个控制终端。如果会话在多用户模式下运行,则它被标记为“多”。标记为“无法访问”的会话要么位于不同的主机上,要么已死亡。当一个无法访问的会话的名称与本地主机的名称或指定的参数(如果有)匹配时,该会话将被视为已死亡。-r
有关如何构建匹配的说明,请参阅标志。应彻底检查并删除标记为“死亡”的会话。如果您不确定,请询问您的系统管理员。使用“ ”选项删除会话-wipe
。
你想要的是这个选项:
'
-x
'
附加到已附加到其他地方的会话(多显示模式)。屏幕拒绝从其自身内部附加。但在级联多个屏幕时,不会检测到循环;请小心。
答案3
我附加到screen
选项-rD
。
请参阅手册:
-D -r
Reattach a session. If necessary detach and logout remotely first.
答案4
据我所知有两种方法:
- screen -rd <屏幕名称/id>
这将分离屏幕并重新连接您。它将关闭任何预先连接的用户的屏幕。
- screen -x <屏幕名称/id>
这将直接将您附加到屏幕,而不会终止附加的用户。这主要用于多用户显示。