Como me reconecto a uma tela perdida (desconectada, soquete ausente)?

23

Eu tive uma screensessão em execução em um servidor doméstico. Minha estação de trabalho precisava de uma reinicialização, então desconectei e matei o terminal. Ao me reconectar ao servidor, eu executo o meu típico

$ screen -D -R
[new screen]

Hã? Não, não uma nova sessão, dê-me a antiga. Eu sei, eu vou pegá-lo diretamente. Qual é o nome do soquete?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

Espere o que? Eu sei que deixei em execução. Para onde foi?

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

Bem, há o processo. Mas não há tomada para onde passar screen -r. Como posso reconectar à minha sessão?

charlatão quixote
fonte

Respostas:

28

Screenverifica o fifo / soquete sempre que recebe um SIGCHLDsinal. Se o soquete estiver faltando, ele será recriado. Portanto, a solução é encontrar o processo e enviá-lo SIGCHLD.

No meu sistema Debian, screenparece estar instalado como setgid, utmpmas não setuid, então a primeira solução da FAQ abaixo funcionou:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

Nos sistemas em que a tela está instalada root, o setuid não funcionará e você precisará matar um dos processos filhos da sessão de tela ativa para forçar o kernel a enviar o sinal para você. Isso significa sacrificar uma das janelas da tela para se reconectar com o restante (escolha sabiamente!).

Em uma FAQ arquivada do Gentoo Wiki :

Soquete ausente

Às vezes, o soquete de uma tela ainda em execução pode ser destruído, embora o processo real e todos os seus processos filhos ainda estejam em execução. screen -list exibirá "Nenhum soquete encontrado em / tmp / uscreens / .." Algumas instruções úteis sobre como se recuperar disso (e alguns outros problemas incomuns) em http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC a cerca de 2/3 do caminho.

P: Por alguma razão desconhecida, o fifo em / tmp / screens / S-myname desapareceu e não consigo retomar minha sessão de tela. Existe uma maneira de recriar o fifo?

A: A tela verifica o fifo / soquete sempre que recebe um sinal SIGCHLD. Se ausente, o fifo / soquete é recriado então.

Se a tela estiver em execução não definida, o usuário poderá emitir um kill -CHLD screenpiddiretamente ( -CHILDem alguns sistemas). Screenpid é o ID do processo de tela encontrado em uma ps -xlistagem.

Mas geralmente isso não funcionará, pois a tela deve ser instalada como root setuid. Nesse caso, você não poderá enviar um sinal, mas o kernel enviará. Faz isso sempre que um filho da tela altera seu estado. Encontre o ID do processo (shellpid abaixo) do shell "menos importante" em execução na tela. A tentativa kill -STOP shellpid. Se o fifo / socket não reaparecer, destrua o processo do shell. Você sacrifica uma concha para salvar o resto. Se nada funcionar, não se esqueça de remover todos os processos em execução na sessão de tela perdida.

charlatão quixote
fonte