A situação aqui:
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
Acho que o que você excluiu é o equivalente ao meu /var/run/screens/S-root/4629.pts-12.inno
. ls -l /proc/$PID/fd
ainda pode apontar para o nó do soquete. Se você excluir arquivos, poderá obter o conteúdo deles por meio de /proc/$PID/fd
, desde que um processo os mantenha abertos. Eu não estou familiarizado com sockets, mas você pode pelo menos tentar: Você pode criar um link simbólico (em vez do soquete excluído) que aponta para o descritor de soquete em /proc/$PID/fd
.
Editar 1:
Pode não ser suficiente definir um link simbólico para um socket porque o processo do cliente pode verificar o tipo de arquivo e encontrar um symlik onde ele espera um socket e assim abortar sem checar o alvo do symlink.
Esse problema talvez possa ser resolvido com socat
. Este programa permite um "encaminhamento de soquete". Acabei de testá-lo (com gpg-agent
em vez de screen
embora; e o soquete original não foi excluído):
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
>
Isso pode funcionar com o FD com sock em /proc
também. Além disso, o socat suporta FIFOs (pipes nomeados).
Editar 2:
Também funciona com FIFOs:
socat PIPE:/proc/8728/fd/3 PIPE:/tmp/uscreens/S-Adrian/8728.pty0.TARDIS
deve fazer.
BTW: Mesmo que isso não resolva seu problema (ainda), eu acho que o esforço e a qualidade da minha resposta devem pelo menos valer a pena ...