conexão emacsclient recusada

3

Estou executando o emacs no modo daemon e me desconectei do servidor no qual ele estava sendo executado. Após reconectar, quando eu corro

emacsclient -nc

Eu recebo o erro

connect localhost port 6012: Connection refused

ERROR: Display localhost:12.0 can't be opened

O daemon ainda parece estar em execução, mas não consigo descobrir como me conectar a ele, alguma sugestão?

Outros fatos divertidos, que podem ou não ser relevantes:

Estou conectado através de uma sessão de tela a um nó principal e depois a outro nó lateral de um servidor.

Eu tenho executado essa configuração por alguns dias e normalmente posso me reconectar sem problemas.

Tenho certeza de que poderia apenas reiniciar o daemon, mas gostaria de recuperar a sessão de trabalho já que ela está conectada a uma tarefa matlab em execução, com a qual estou interagindo com o matlab-emacs.

Editar: Eu tentei a sugestão de Gilles e ainda estou com problemas

echo $DISPLAY

retorna

localhost:18.0

Eu fui para a sessão de tela e corri

export DISPLAY=localhost:18.0

e até mesmo correu     eco $ DISPLAY novamente dentro da sessão de tela

localhost:18.0

Agora o emacsclient -nc retorna

ERROR: Display localhost: 18.0 can't be opened

que agora é a mesma tela sendo usada na máquina que executa a sessão de tela, mas ainda não há conexão.

Note que eu tentei também com

 export display=localhost:18

edit2: Uma nota sobre a arquitetura do meu sistema Meu laptop, no meu escritório, está conectado via ssh a um servidor 'host1'. host1 tem vários computadores de nó. Eu primeiro crio ou faço login em uma sessão de tela

 screen -S ohnoplus-five

e, em seguida, conecte-se ao node005 com

ssh node005

Eu então desanexo da tela sem sair do node005 e reconectar com

tela -r ohnoplus-five

do host1

Em resposta às sugestões de Gills, executei a exportação DISPLAY = localhost18.0, que é a exibição retornada pelo echo $ DISPLAY no host1, não no meu laptop local.

    
por ohnoplus 29.08.2015 / 03:09

1 resposta

2

Conexões GUI remotas (X11) passam pela porta TCP 6000+ n onde n é o número de exibição¹. Portanto, as duas mensagens referem-se ao mesmo problema: alguns programas tentaram se conectar para exibir 12 e falharam.

O Emacsclient não faz conexões X11, o Emacs faz. Então, se você vir esta mensagem, significa que o Emacsclient conseguiu entrar em contato com o Emacs e informá-lo para abrir um novo quadro. O Emacsclient solicita um quadro de GUI, se ele acha que um display X11 está disponível, e um quadro de terminal, caso contrário. Quando a variável de ambiente DISPLAY está definida, o Emacsclient acha que uma exibição X11 está disponível.

A variável de ambiente DISPLAY é definida automaticamente pelo SSH quando está encaminhando uma conexão X11 de volta à sua máquina local. Mas quando você anexa a uma sessão de tela existente, você obtém o ambiente que foi definido dentro da sessão de tela, incluindo a variável DISPLAY . Se você desconectar e reconectar, não há garantia de que o número de exibição seja o mesmo².

Para atualizar a variável DISPLAY , desanexe da sessão Tela, execute echo $DISPLAY para ver o valor definido pelo SSH (por exemplo, localhost:13 ), anexe novamente à sessão Tela e execute export DISPLAY=localhost:13 (ou qualquer que seja o número correto é). Se você tiver várias janelas na sessão de tela, precisará fazer isso em cada uma delas. Se você criar novas janelas, digite Ctrl + A : setenv localhost: 13 ' Enter para definir o ambiente variável na tela em si, por causa das novas janelas.

Se preferir, você pode abrir um quadro de terminal desarmando DISPLAY ou executando emacsclient -nw .

¹ O SSH usa números de exibição a partir de 10, deixando números de 0 a 9 apenas para exibições locais. Em uma situação típica, a tela 12 indica que esta é a terceira conexão da GUI que foi aberta sobre o SSH.
² Na verdade, se você foi desconectado devido a um problema de rede, mas reconectado logo depois, é bem possível que a máquina remota ainda não tenha notado o problema de rede - tudo o que sabe é que já faz um tempo desde que o cliente enviou qualquer coisa, mas isso é apenas inatividade normal - nesse caso, a tela 12 ainda está em uso no que se refere à máquina remota.

Se você tiver vários saltos SSH e a conexão da máquina local para a máquina intermediária for interrompida e retomada, então, após a retomada, o número de exibição na máquina intermediária foi alterado, mas a conexão SSH da máquina intermediária para a máquina final ainda encaminha o número do mostrador original.

Nesse cenário, seria mais simples se você executasse Screen somente na máquina final e usasse a máquina intermediária como proxy . Adicionar

Host node[0-9]*
ProxyCommand ssh -W %h:%p host1

para o seu ~/.ssh/config e execute ssh node005 . Então você não precisa se preocupar com a máquina intermediária.

Se você tiver que executar o Screen na máquina intermediária, será necessário reiniciar a conexão SSH do host1 ao node005, depois de atualizar a variável DISPLAY . (Você também pode encaminhar a conexão TCP do número de exibição antigo para o novo, mas isso só funcionaria se o número de exibição antigo não fosse reutilizado nesse meio tempo.)

    
por 29.08.2015 / 19:25