![有没有办法重新连接 /tmp/uscreens/... 中没有命名管道的屏幕会话?](https://linux22.com/image/611552/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E9%87%8D%E6%96%B0%E8%BF%9E%E6%8E%A5%20%2Ftmp%2Fuscreens%2F...%20%E4%B8%AD%E6%B2%A1%E6%9C%89%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93%E7%9A%84%E5%B1%8F%E5%B9%95%E4%BC%9A%E8%AF%9D%EF%BC%9F.png)
我在重新连接到屏幕会话时遇到了困难,因此我尝试终止客户端屏幕会话并重新连接到服务器会话。这失败了。然后我做了一件有点愚蠢的事情。我执行了 -wipe。现在目录中没有命名管道文件/tmp/uscreens/...
。
屏幕服务器仍在运行,我想知道是否有可能重新创建命名管道。
我使用的是 Screen 版本 4.00.03 (FAU) 23-Oct-06,在 cygwin 下运行,在 Win7 Home Premium 下运行。虽然我可以通过关闭屏幕服务器及其子服务器来恢复,但我宁愿不这样做。
有任何想法吗?
编辑:这是我的 fd 目录中的列表:
$ ls -l /proc/8728/fd/ 共 0 lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 0 -> /dev/null lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 1 -> /dev/null lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 10 -> /dev/ptmx lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 11 -> /cygdrive/c/Users/Adrian/Downloads/arduino-1.0.3-windows/Projects/RangeDetector5/screenlog.2 lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 2 -> /dev/null lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 3 -> /tmp/uscreens/S-Adrian/8728.pty0.TARDIS lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 4 -> /dev/pty0 lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 5 -> /var/run/utmp lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 6 -> /dev/ptmx lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 7 -> /cygdrive/c/Users/Adrian/Downloads/arduino-1.0.3-windows/Projects/RangeDetector5/screenlog.0 lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 8 -> /dev/ptmx lrwxrwxrwx 1 Adrian None 0 5月 12 22:32 9 -> /cygdrive/c/Users/Adrian/Downloads/arduino-1.0.3-windows/Projects/RangeDetector5/screenlog.1
答案1
这里的情况:
start cmd: # ps -o pid,args -p 4629 --no-headings
4629 SCREEN
start cmd: # ls -l /proc/4629/fd | grep socket
lrwx------ 1 root root 64 13. Mai 02:55 4 -> socket:[90202]
start cmd: # lsof -n | grep 90202
screen 4629 [...] 90202 /var/run/screens/S-root/4629.pts-12.inno
我猜你删除的内容相当于我的/var/run/screens/S-root/4629.pts-12.inno
。ls -l /proc/$PID/fd
可能仍然指向套接字节点。如果你删除文件,那么/proc/$PID/fd
只要进程保持它们打开,你就可以通过 获得它们的内容。我不熟悉套接字,但你至少可以尝试一下:你可以创建一个符号链接(而不是已删除的套接字),它指向 中的套接字描述符/proc/$PID/fd
。
编辑1:
将符号链接设置为套接字可能还不够,因为客户端进程可能会检查文件类型并在其期望套接字的位置找到符号链接,从而在不检查符号链接目标的情况下中止。
这个问题也许可以用 来解决socat
。这个程序允许“套接字转发”。我刚刚测试过它(虽然用gpg-agent
而不是screen
;并且原始套接字没有被删除):
start cmd:> echo $GPG_AGENT_INFO
/tmp/gpg-DMOHGo/S.gpg-agent:3236:1
# next command in another shell
start cmd:> socat UNIX-LISTEN:gpg-agent-socket UNIX-CONNECT:/tmp/gpg-DMOHGo/S.gpg-agent
start cmd:> GPG_AGENT_INFO=/home/hl/tmp/gpg-agent-socket:3236:1
start cmd:> start cmd:> gpg-connect-agent
>
这可能也适用于 中的套接字 FD /proc
。此外,socat 支持 FIFO(命名管道)。
编辑2:
它也适用于 FIFO:
socat PIPE:/proc/8728/fd/3 PIPE:/tmp/uscreens/S-Adrian/8728.pty0.TARDIS
应该做。
顺便说一句:即使这不能解决你的问题(暂时),我确实认为我的回答的努力和质量至少值得一赞......