Como recuperar um shell após uma desconexão

37

Estou fazendo algum trabalho em uma máquina remota do CentOS 5.6 e minha rede continua caindo. Existe uma maneira de recuperar minhas sessões suspensas depois de me reconectar?

EDIT: estou atualizando e instalando com o yum e estou preocupado que isso possa ser um problema se os processos continuarem pendurados no meio do que eles estão fazendo.

Jeff Schaller
fonte
6
tmux ou tela.
sehe

Respostas:

63

Não há como, mas para evitar isso, eu gosto de usar tmux. Inicio o tmux, inicio a operação e continuo o meu caminho. Se eu retornar e descobrir que a conexão foi interrompida, tudo o que preciso fazer é reconectar e digitar tmux attach.

Aqui está um exemplo.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion
Braiam
fonte
não tem tmux, e não estou autorizado a instalar as coisas não na minha lista para fazer ...
5
@sergio Meu coração sangra :-)) Use screen.
4
@sergio Em um sistema Unix, praticamente qualquer aplicativo que não exija permissão de root para ser executado pode ser instalado em um diretório pessoal.
Kusalananda
35

As recomendações para tmux e screen são boas sugestões. Elas implicam a resposta à sua pergunta, mas na verdade não a declaram. A resposta para a pergunta é: não há como. Se você fizer login via ssh, o shell será encerrado quando a conexão cair. A solução é fazer login e iniciar imediatamente um terminal virtual de algum tipo (como tmux). Quando a conexão cai, o shell em que você está termina, mas você pode abrir um novo shell e reconectar-se ao terminal virtual (que está executando o shell no qual você está realmente fazendo seu trabalho).

William Pursell
fonte
Está bem. está claro agora.
Supondo que o processo yum ainda seja executado (não foi encerrado imediatamente quando o shell recebeu o SIGHUP), o reptyr ou similar pode ser suficiente para recuperar o processo ou - na falta disso - obter qualquer saída futura. O shell geralmente seria encerrado com a desconexão.
Eroen
@Eroen Você quer dizer, mesmo usando o tmux, o sistema operacional encerrará o processo do tmux assim que descobrir que a conexão está perdida?
Dojo
@Dojo Quando a conexão é encerrada, a instância do tmux será interrompida, mas a sessão do tmux (e os shells gerenciados) permanecerão ativados.
William Pursell
Se o usuário perdeu a conexão com o servidor ssh remoto porque, por exemplo, repentinamente desconectou acidentalmente o cabo RJ-45, acho que o servidor ssh ainda mantém essa sessão até um tempo limite predefinido (120 segundos, por exemplo). Portanto, neste caso, existe uma maneira de retomar esta sessão que ainda está ativa no servidor ssh dentro de 120 segundos após o cabo ser desconectado?
Gab是好人
8

Como William disse, a resposta curta é não, não há como. Para evitar isso, você pode usar o comando screen antes de perder a conexão

Nicholas Smith
fonte
pelo que entendi, eu teria que ter iniciado yum com tela ... bem, eu não. Eu não posso repetir yum, ele diz que ainda está sendo usado e não quero forçar a matá-lo. ..Como posso recuperar o controle do yum em execução?
e Byobu é um bom complemento para a tela, para obtê-lo automaticamente lançado em uma boa gráfica terminal de launchpad.net/byobu
Até onde eu sei, você não pode, a menos que haja alguma maneira oculta de redirecionar a saída do comando yum para a sua sessão de termo atual, mas não consigo pensar em uma delas.
Nicholas Smith
Há várias soluções parciais para isso usando depuradores & c. para dar a um processo um novo shell pai. Reptyr é um deles, e uma postagem no blog descreve o problema, a solução alternativa e algumas outras implementações.
Eroen
3

Não, você não pode recuperar um shell após uma desconexão. Em vez disso, o que você pode fazer é garantir que o comando que você estava executando continue executando após a desconexão.

Para conseguir isso, use os comandos "nohup" e "disown", que geralmente são comandos integrados na maioria dos shells, ou seja, você não precisa instalar nada. Porém, isso funciona apenas para comandos não interativos.

Portanto, as etapas seriam as seguintes:

  1. Faça login no servidor
  2. Execute seu comando: "nohup sudo yum update &" (isso também registrará toda a saída no arquivo nohup.out no diretório atual)
  3. Execute "disown% 1"
  4. Sinta-se à vontade para desconectar neste momento ou esperar para ser desconectado :)

Quando você voltar ao servidor, simplesmente "tail nohup.out" para ver como está o comando.

zygis
fonte
Isso não funcionaria muito mal no caso geral ? Por exemplo, com comandos que desejam entrada de uma vez ou outra ... Para comandos completamente não interativos, pode funcionar bem o suficiente e evitar a sobrecarga (e possivelmente a necessidade de instalar) de um multiplexador de terminal.
um CVn 17/09/13
Sim, isso só funciona se seus comandos não desejam nenhuma entrada do usuário. Atualizei a resposta. No geral, um multiplexador de terminal é o caminho a percorrer, com certeza, mas foi mencionado que nenhuma ferramenta adicional foi permitida a instalação.
zygis 17/09/2013
Absolutamente, é uma resposta válida, apenas um pouco limitada em seus possíveis casos de uso. Votado com a edição.
um CVn 18/09/13
3

Alguém adicionou reptyr em um comentário, em vez de uma resposta, então não posso votar novamente, mas parece uma boa resposta para a pergunta editada e funcionou muito bem no CentOS.

consulte: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Existe uma maneira de recuperar minhas sessões suspensas depois de me reconectar?

EDIT: estou atualizando e instalando com o yum e estou preocupado que isso possa ser um problema se os processos continuarem pendurados no meio do que eles estão fazendo.

Então, a mesma coisa, eu perdi a conexão remota com uma sessão de atualização do yum. Então eu procurei e encontrei esta pergunta ... então reconecte e usei a tela desta vez:

  1. reconectar ssh
  2. tela
  3. instale reptyr conforme os links acima
  4. ps -a grep yum
  5. reptyr psid

e lá estou eu, no prompt recuperado, que yum estava dando algumas horas antes.

Tecnicamente, as respostas estão todas corretas, isso NÃO é uma recuperação de uma sessão interrompida, é uma reparação de um processo órfão à sessão atual. E muito útil também é ...

ingleno
fonte
1

Como muitas pessoas sugeriram screene tmux, ambas suportam funcionalidade básica, mas possuem recursos específicos distintos, portanto, não se pode dizer que uma seja superior à outra em todos os casos. Por exemplo, apenas o tmux suporta a divisão de janelas , enquanto apenas a tela GNU pode alternar a quebra de linha longa com (Ctrl + ar). Veja uma comparação mais detalhada aqui .

Também existem ferramentas especificamente para corrigir esse problema do ssh:

Autossh é um programa para iniciar uma cópia do ssh e monitorá-lo, reiniciando-o conforme necessário, caso ele morra ou pare de passar o tráfego. A ideia é do rstunnel.

O Mosh é um aplicativo de terminal remoto que permite roaming, suporta conectividade intermitente e fornece eco local inteligente e edição de linha das teclas do usuário. Mosh é um substituto para o SSH. É mais robusto e ágil, principalmente através de links Wi-Fi, celulares e de longa distância.

Yaroslav Nikitenko
fonte
-1

Isso pode ser feito usando o tmuxshell. Se você for desconectado, a maneira mais rápida de reconectar uma sessão é:

tmux a #0
cmcginty
fonte
Isso não acrescenta nada que a resposta aceita não diga. Ele também pressupõe que o usuário já tenha uma tmuxsessão em execução.
Kusalananda
2
Pode ser um comentário sobre essa resposta dizendo "você pode abreviar attachcomo a".
Jeff Schaller