Existe uma maneira de reconectar a sessão de tela que não possui um pipe nomeado em / tmp / uscreens /…?

1

Eu estava tendo dificuldades em me reconectar a uma sessão de tela, então tentei matar a sessão da tela do cliente e reconectar à sessão do servidor. Isso falhou. Então eu fiz algo meio estúpido. Eu fiz um -wipe. Agora não tenho nenhum arquivo de pipe nomeado no diretório /tmp/uscreens/... .

O servidor de tela ainda está em execução e eu queria saber se era possível recriar o pipe nomeado.

Estou usando a versão 4.00.03 (FAU) da tela 23-Oct-06 rodando sob o cygwin rodando sob o Win7 Home Premium. Embora eu pudesse me recuperar de matar a tela e suas crianças, eu preferiria não fazê-lo.

Alguma idéia?

EDITAR : Aqui está a lista do meu diretório fd:

$ ls -l /proc/8728/fd/
total 0
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 0 -> /dev/null
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 1 -> /dev/null
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 10 -> /dev/ptmx
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 11 -> /cygdrive/c/Users/Adrian/Downloads/arduino-1.0.3-windows/Projects/RangeDetector5/screenlog.2
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 2 -> /dev/null
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 3 -> /tmp/uscreens/S-Adrian/8728.pty0.TARDIS
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 4 -> /dev/pty0
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 5 -> /var/run/utmp
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 6 -> /dev/ptmx
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 7 -> /cygdrive/c/Users/Adrian/Downloads/arduino-1.0.3-windows/Projects/RangeDetector5/screenlog.0
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 8 -> /dev/ptmx
lrwxrwxrwx 1 Adrian None 0 May 12 22:32 9 -> /cygdrive/c/Users/Adrian/Downloads/arduino-1.0.3-windows/Projects/RangeDetector5/screenlog.1
    
por Adrian 13.05.2013 / 02:50

1 resposta

2

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 ...

    
por 13.05.2013 / 03:15

Tags