A leitura desta pergunta me fez pensar. Assumindo que screen
não está sendo usado. Se uma sessão SSH em um destino Linux for descartada, por qualquer motivo, e você se reconectar antes que o servidor termine a sessão por causa do tempo limite, é possível recuperar o controle do comando em execução, de modo que não seja interrompido por causa da sessão interrompida ?
32
Respostas:
Tentar conectar os descritores de arquivo STD * atuais de um novo terminal a um processo em execução antigo está apenas causando problemas. Mesmo que você consiga fazer isso, o controle de trabalho do terminal não funcionará conforme o esperado. Você terá uma bagunça deixada para trás se sair do programa assumido, e o que acontece com o shell que sacrificou seus descritores de arquivo para serem entregues ao processo em segundo plano. O ssh permanecerá aberto quando esse shell desaparecer? Provavelmente não. Então, você precisará redirecioná-lo para outro lugar primeiro.
Possível ou não, eu apostaria que é mais desejável deixar o processo abandonado ser morto "naturalmente". Se você estiver fazendo algo importante o suficiente para justificar a tentativa de fazer todo o hackery necessário para retomar o controle e estiver em um link instável, provavelmente deve saber disso com antecedência e apenas usar a tela (ou vnc, ou o que flutua no seu desanexado - barco de controle). :)
fonte
Sei que essa é uma pergunta antiga, mas achei importante adicionar minhas descobertas caso outra pessoa se deparasse com isso como eu.
Eu não vi nenhuma conseqüência incomum em fazer isso sim, mas é isso que eu usei e funcionou surpreendentemente. Às vezes, quando executamos processos longos em nosso servidor, ele ocasionalmente desconecta a sessão ssh. O processo junto com a sessão tty parece continuar em execução, mas não podemos reconectá-lo. Encontrei o programa abaixo para puxar o processo para a sessão recém-conectada.
https://github.com/nelhage/reptyr
Aqui está mais informações
https://blog.nelhage.com/2011/02/changing-ctty/
fonte
Geralmente, a maneira correta de lidar com isso é se preparar com antecedência, usando GNU
screen
ou bash'snohup
oudisown
mecanismos. Se você estiver usandotcsh
, o shell rejeitará os trabalhos em segundo plano quando sair anormalmente.Se você não estiver usando,
screen
mas conseguiu manter o processo em execução por meio de um dos métodos renegados , poderá reconectar-se ao processo comgdb
( fonte ):Agora, você precisará ajustar esse processo para sua situação. Duvido que ajudaria se você não conseguiu negar o processo. Se você estiver usando
bash
, consulte esta postagem sobre como fazer com que o bash desista automaticamente dos processos em segundo plano na saída (basicamente desative o huponexit com o shopt ). Com um processo em primeiro plano, você precisa ter usado nohup .fonte
Provavelmente não. Não posso garantir que seja impossível, mas duvido muito.
Uma coisa é a falta de interrupção do shell e possíveis comandos em execução como conseqüência do término da conexão ssh. Isso não é tão difícil, você deve poder usar nohup e mecanismos semelhantes, como mencionado na outra pergunta.
Mas, então, suponha que você iniciou
ssh somehost nuhup vim /some/file
e a conexão morre. Você corressh somehost
para efetuar login novamente e pode ver que seu processo vim ainda está em execução. Mas então, como você se conecta a esse processo novamente? Os processos interativos de forground têm um controle tty e aquele aberto para o processo vim quando iniciado, desde então, foi fechado. Não tenho certeza se existe alguma maneira de "reabri-lo" novamente no seu novo shell (como se você tivesse vários trabalhos em segundo plano em execução em um shell, não poderá colocar em primeiro plano nenhum deles em outro shell).Screen
foram escritos explicitamente para ter essa funcionalidade. Na inicialização, bifurca-se dois processos, um processo de gerenciamento de terminal e um processo de cliente. A interação é o aplicativo cliente <--> terminal manager <--> e, quando você desanexa ou perde a conexão, o processo do cliente morre enquanto o gerenciador de terminal continua ativo. A tela tem algum suporte específico para anexar ao processo de gerenciamento de terminal novamente mais tarde, e não acho que isso seja possível no caso geral.fonte
retty pode ajudá-lo, mas os avisos de isenção de responsabilidade são muito reais e relevantes :)
fonte
Se a sessão for interrompida, significa que o TTL já expirou, portanto não haverá mais tty para você (como eu a entendo). Mas, se sua conexão de rede for interrompida, sua sessão SSH pode não precisar ser desativada e você poderá retomar sua conexão e continuar. É sobre isso que você está perguntando?
fonte
Havia um link para algum código de roubo tty hacky nesta questão . Teoricamente, você deve poder usar isso para recuperar o controle de um processo de nohup.
fonte