如何重新连接到丢失的屏幕(分离的,缺少的插槽)?


23

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。如何重新加入会话?

Answers:


28

Screen接收到SIGCHLD信号时检查fifo / socket 。 如果套接字丢失,它将被重新创建。 因此,解决方案是找到进程并将其发送SIGCHLD

在我的Debian系统上,screen似乎安装为setgid utmp而不是setuid,因此下面常见问题解答中的第一个解决方案有效:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

在安装了屏幕setuid的系统上root,这将无法工作,并且您需要终止活动屏幕会话的子进程之一,以强制内核为您发送信号。这意味着牺牲一个屏幕窗口以与其余窗口重新连接(明智地选择!)。

来自存档的Gentoo Wiki常见问题解答

插座缺失

尽管实际进程及其所有子进程仍在运行,但有时仍可以破坏仍在运行的屏幕的套接字。屏幕列表将显示“在/ tmp / uscreens /中没有找到套接字”。有关如何从中恢复的一些便捷说明(以及一些其他常见问题),请访问http://www4.informatik.uni-erlangen.de/ 〜jnweiger / screen-faq.html#MISC 大约有2/3。

问:由于某些未知原因,/ tmp / screens / S-myname中的FIFO已消失,我无法恢复屏幕会话。有没有办法重新创建fifo?

答:屏幕会在收到SIGCHLD信号时检查fifo / socket。如果缺少,则会重新创建fifo / socket。

如果屏幕运行的不是set-uid,则用户可以kill -CHLD screenpid直接发出 (-CHILD在某些系统上)。Screenpid是在ps -x清单中找到的屏幕进程的进程ID 。

但是通常这将不起作用,因为屏幕应安装setuid root。在这种情况下,您将无法发送信号,但内核将发送信号。每当屏幕的子级更改其状态时,它就会这样做。找到在屏幕内运行的“最不重要”的shell的process-id(下面的shellpid)。试试看kill -STOP shellpid。如果fifo / socket没有重新出现,请破坏shell进程。您牺牲一个外壳来保存其余的外壳。如果没有任何效果,请不要忘记删除丢失的屏幕会话中正在运行的所有进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.