如何重新连接丢失的屏幕(分离、缺少插座)?

如何重新连接丢失的屏幕(分离、缺少插座)?

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 窗口来重新连接其他窗口(请明智选择!)。

已归档 Gentoo Wiki 常见问题解答

插座缺失

有时,仍在运行的屏幕的套接字可能会被破坏,但实际进程及其所有子进程仍在运行。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 是在列表中找到的屏幕进程的进程 ID ps -x

但通常这不会起作用,因为 screen 应该以 setuid root 身份安装。在这种情况下,您将无法向其发送信号,但内核可以。每当 screen 的子进程改变其状态时,它都会这样做。查找在 screen 内运行的“最不重要”shell 的进程 ID(下面的 shellpid)。尝试kill -STOP shellpid。如果 fifo/socket 没有重新出现,则销毁 shell 进程。您牺牲一个 shell 来拯救其余的 shell。如果什么都不起作用,请不要忘记删除在丢失的 screen 会话中运行的所有进程。

相关内容