我之前曾使用 重新连接到长时间运行的屏幕会话screen -dr control
。但是,有时此命令不会重新连接到屏幕,而是永远挂起(10 多分钟后我中止了)。这仅在 SSH 连接意外断开时发生,而不是在使用 正确断开屏幕时发生Ctrl-A d
。其他开关(例如screen -x
或 )screen -D -RR
也不起作用。
这个帖子建议终止持有 screen 会话的 PTY,这将导致 screen 完全断开连接。但是,它只会终止screen -dr control
调用它的 shell。
例如:
$ ps -ef | grep control | grep -v grep
nomad 7387 7109 0 13:05 pts/50 00:00:00 screen -dr control
nomad 15299 1 0 Nov27 ? 00:13:47 SCREEN -S control
$ ps -ef | grep bash | grep 'pts/50'
nomad 7109 7108 0 12:49 pts/50 00:00:00 -bash
链接的帖子建议杀死bash
PID 为 7109 的进程。这也会杀死screen -dr control
PID 为 7387 的进程。之后,我仍然无法连接到屏幕。
SCREEN -S control
启动屏幕会话的进程有init
其父进程,我显然无法终止它。
有没有办法重新连接到挂起的屏幕会话?
更新:这种情况发生在使用内核 2.6.32-358.6.1.el6.x86_64 的 CentOS 6.4 上。所有 shell 都是 bash 版本 4.1.2(1)-release。
答案1
我认为你应该尝试
screen -DR
下次也是如此 - 愤怒的(大写)调用应该迫使它断开由中间 netcat 跳跃持有的其他会话。
答案2
根据 Jens Timmerman 的建议,这种奇怪行为的根本原因是我使用 SSH ProxyCommand 和 连接到远程服务器ncat
。在中间机器上终止后ncat
,我能够重新连接到屏幕会话。
答案3
如果这是一个常见的问题,你也可以考虑使用 mosh 作为 ssh 的替代品: