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进程。您牺牲一个外壳来保存其余的外壳。如果没有任何效果,请不要忘记删除丢失的屏幕会话中正在运行的所有进程。