GNU 屏幕:无法从中断的远程会话恢复屏幕

GNU 屏幕:无法从中断的远程会话恢复屏幕

有时,SSH外壳具有活动screen会话到我的远程服务器获取破碎的(例如,互联网线路不是很稳定),会话仍然连接。

然后我再次通过 SSH 连接到服务器,然后尝试恢复会议screen

luis@Zarzamoro:~$ screen -r
There is a screen on:
        9166.pts-2.Zarzamoro    (12/23/15 23:47:34)     (Attached)
There is no screen to be resumed.
luis@Zarzamoro:~$ screen -r 9166.pts-2.Zarzamoro
There is a screen on:
        9166.pts-2.Zarzamoro    (12/23/15 23:47:34)     (Attached)
There is no screen to be resumed matching 9166.pts-2.Zarzamoro.

我对 GNU screen 不太了解。为什么会发生这种情况吗?
是否有可能恢复screen次会议?

答案1

使用:

screen -r -d <pid>.<tty>.<host>

在你的情况下:

screen -r -d 9166.pts-2.Zarzamoro

这将强制分离另一端的屏幕并连接。

答案2

两点:

  • 您不必指定整个 pid+会话名称(屏幕接受合理的缩写)。

  • 使用该选项您可能会获得更好的结果-x

来自手册页:

-r
sessionowner/[pid.sessionname]' 恢复超然的屏幕会话。

-x
附加到已经存在的会话随附的其他地方(多显示模式)。屏幕拒绝从自身内部附着。但多屏级联时,不会检测到循环;小心。

答案3

这种情况偶尔也会发生在我身上。我相信发生的情况是您的 tty 没有正确地与屏幕分离,因此当您重新连接到服务器时,您仍然“附加”到屏幕。

这就是我所做的:

screen -d
screen -r (if you have only one screen)
screen -r <pid> (if you have more than one screen)

你也可以做

screen -r -d (add <pid> if you have more than one screen)

分离并重新连接未正确连接的屏幕。

另外,执行此操作时,screen -r您无需指定整个屏幕的名称,只需指定 pid(四位数)。

答案4

您甚至可以自动执行此操作,如以下所示这里它将自动重新连接到现有的屏幕会话(如果不存在,则创建一个新的屏幕会话):

.bashrc

在目标主机上的 ~/.bashrc 顶部添加以下行:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ]
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  [ -d $HOME/lib/screen-logs ] || mkdir -p $HOME/lib/screen-logs
  sleep 1
  screen -RR && exit 0
  # normally, execution of this rc script ends here...
  echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

相关内容