我以前曾与进行长时间的屏幕对话screen -dr control
。但是,有时此命令不会重新连接到屏幕,而是会永久挂起(在我终止后的10分钟以上)。仅当SSH连接意外断开时才会发生这种情况,而在用正确断开屏幕后则不会发生Ctrl-A d
。其他开关,例如screen -x
或screen -D -RR
也不起作用。
这篇文章建议杀死举行屏幕会话的PTY,这将导致屏幕完成其断开连接。但是,它只是杀死了screen -dr control
被调用的外壳。
例如:
$ 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 的进程。这也将终止使用PID 7387的screen -dr control
进程。之后,我仍然无法连接到屏幕。
SCREEN -S control
启动屏幕会话的进程具有init
其父进程,我显然不能杀死它。
有没有办法重新连接到挂屏会话?
更新:这在使用内核2.6.32-358.6.1.el6.x86_64的CentOS 6.4上发生。这些外壳都是bash版本4.1.2(1)-发行版。
尝试在屏幕进程上运行lsof,看看是否有“卡住”的东西。屏幕使用unix套接字在进程之间进行通信,可能是某些原因使其保持打开状态。另外,请确保未删除套接字或更改了其所有权。通常,您还应该包括所使用的操作系统和版本,尽管我没有什么特别的想法,这一次将取决于操作系统。
—
丹·普里兹
您是否正在通过另一跳进行ssh'ing,例如使用netcat作为代理命令?在这种情况下,我遇到了到第一个框的ssh连接断开的问题,但是netcat proxy命令使“第二个” ssh连接保持打开状态。-d应该可以工作。
—
詹斯·蒂默曼
詹斯,您的建议成功了。我确实通过netcat进行了代理,并在中间主机上将其杀死,这使我得以重新连接到屏幕上。
—
维克多·罗森菲尔德
您为什么要杀死挂屏命令的父进程?您想杀死附加屏幕命令本身。#7387在您的情况下。
—
Matthias Urlichs,2014年
screen -ls
在那些“挂”的情况下说?screen -d -r <session>
表示“分离并恢复”,因此不必直接分离它就没关系。(而且通常不