我screen在家庭服务器上运行了一个会话。我的工作站需要重新启动,所以我分离并关闭了终端。重新连接到服务器后,我执行我的典型
$ screen -D -R
[new screen]
Run Code Online (Sandbox Code Playgroud)
嗯?不,不是新会议,给我旧会议。我知道了,我会直接抢的。插座名称是什么?
$ screen -list
No Sockets found in /var/run/screen/S-username
$ ls -a /var/run/screen/S-username
. ..
Run Code Online (Sandbox Code Playgroud)
等等……什么?我知道我让它运行了。去哪儿了?
$ ps -ef | grep -i screen
username 30860 1 0 Oct16 ? 00:00:29 SCREEN
Run Code Online (Sandbox Code Playgroud)
嗯,有过程。但是没有可以传递给screen -r. 如何重新连接到我的会话?
qua*_*ote 28
Screen每当收到SIGCHLD信号时检查 fifo/socket 。 如果套接字丢失,它将被重新创建。 所以解决办法就是找到进程并发送SIGCHLD。
在我的 Debian 系统上,screen似乎安装为 setgidutmp而不是 setuid,因此下面常见问题解答中的第一个解决方案有效:
$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost
Run Code Online (Sandbox Code Playgroud)
在 screen 安装了 setuid 的系统上root,这不起作用,您需要终止活动 screen 会话的子进程之一以强制内核为您发送信号。这意味着牺牲您的屏幕窗口之一以与其余窗口重新连接(明智地选择!)。
插槽丢失
有时,虽然实际进程及其所有子进程仍在运行,但仍在运行的屏幕的套接字可能会被破坏。screen -list 将显示“No Sockets found in /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。
如果 screen 正在运行非 set-uid,用户可以
kill -CHLD screenpid直接发出 a (-CHILD在某些系统上)。Screenpid 是在ps -x列表中找到的屏幕进程的进程 ID 。但通常这行不通,因为 screen 应该安装 setuid root。在这种情况下,您将无法向它发送信号,但内核会。每当 screen 的孩子改变其状态时,它就会这样做。找到在屏幕内运行的“最不重要”的 shell 的进程 ID(下面的 shellpid)。尝试
kill -STOP shellpid。如果 fifo/socket 没有重新出现,则销毁 shell 进程。你牺牲一个壳来保存其余的。如果没有任何效果,请不要忘记删除在丢失的屏幕会话中运行的所有进程。
| 归档时间: |
|
| 查看次数: |
23303 次 |
| 最近记录: |