![如何重新连接丢失的屏幕(分离、缺少插座)?](https://linux22.com/image/1219379/%E5%A6%82%E4%BD%95%E9%87%8D%E6%96%B0%E8%BF%9E%E6%8E%A5%E4%B8%A2%E5%A4%B1%E7%9A%84%E5%B1%8F%E5%B9%95%EF%BC%88%E5%88%86%E7%A6%BB%E3%80%81%E7%BC%BA%E5%B0%91%E6%8F%92%E5%BA%A7%EF%BC%89%EF%BC%9F.png)
我screen
在家用服务器上运行了一个会话。我的工作站需要重新启动,所以我断开连接并关闭了终端。重新连接到服务器后,我执行了我通常的操作
$ screen -D -R
[new screen]
啊?不,不是新会话,给我旧会话。我知道,我会直接抓取它。套接字名称是什么?
$ screen -list
No Sockets found in /var/run/screen/S-username
$ ls -a /var/run/screen/S-username
. ..
等一下...什么?我知道我让它运行了。它去哪儿了?
$ ps -ef | grep -i screen
username 30860 1 0 Oct16 ? 00:00:29 SCREEN
嗯,有进程。但是没有套接字可以传递给screen -r
。我该如何重新连接到我的会话?
答案1
Screen
每当接收到信号时就检查 fifo/socket SIGCHLD
。 如果套接字丢失,则会重新创建。 所以解决方案是找到该进程并发送它SIGCHLD
。
在我的 Debian 系统上,screen
似乎安装为 setgidutmp
而不是 setuid,因此下面常见问题解答中的第一个解决方案有效:
$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost
在 screen 安装为 setuid 的系统上root
,此方法不起作用,您需要终止活动 screen 会话的一个子进程,以强制内核为您发送信号。这意味着要牺牲一个 screen 窗口来重新连接其他窗口(请明智选择!)。
插座缺失
有时,仍在运行的屏幕的套接字可能会被破坏,但实际进程及其所有子进程仍在运行。screen -list 将显示“在 /tmp/uscreens/ 中找不到套接字”。有关如何从此问题(以及其他一些不常见的问题)中恢复的一些方便的说明,请访问http://www4.informatik.uni-erlangen.de/~jnweiger/screen-faq.html#MISC 大约 2/3 的路程。
问:由于某些未知原因,/tmp/screens/S-myname 中的 fifo 消失了,我无法恢复我的屏幕会话。有没有办法重新创建 fifo?
A:每当收到 SIGCHLD 信号时,Screen 都会检查 fifo/socket。如果缺失,则会重新创建 fifo/socket。
如果屏幕正在运行非 set-uid用户可以
kill -CHLD screenpid
直接发出(在某些系统上是这样的-CHILD
)。Screenpid 是在列表中找到的屏幕进程的进程 IDps -x
。但通常这不会起作用,因为 screen 应该以 setuid root 身份安装。在这种情况下,您将无法向其发送信号,但内核可以。每当 screen 的子进程改变其状态时,它都会这样做。查找在 screen 内运行的“最不重要”shell 的进程 ID(下面的 shellpid)。尝试
kill -STOP shellpid
。如果 fifo/socket 没有重新出现,则销毁 shell 进程。您牺牲一个 shell 来拯救其余的 shell。如果什么都不起作用,请不要忘记删除在丢失的 screen 会话中运行的所有进程。