有时,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 不太了解。为什么会发生这种情况吗?
是否有可能恢复这scree
n次会议?
答案1
使用:
screen -r -d <pid>.<tty>.<host>
在你的情况下:
screen -r -d 9166.pts-2.Zarzamoro
这将强制分离另一端的屏幕并连接。
答案2
答案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]