Comando Continuar em execução na sessão SSH descartada

32

A leitura desta pergunta me fez pensar. Assumindo que screennã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 ?

John Gardeniers
fonte
Que comando é esse? Acho que geralmente a resposta é não.
davr 23/02/10
Nenhum comando em particular, estou apenas perguntando como um conceito geral.
John Gardeniers
11
Alguém com um entendimento abrangente de como as sessões tty são inicializadas pode ser capaz de nos dizer como. Parece que se você pudesse recriar uma nova sessão no mesmo tty e atribuir explicitamente o PPID anterior, isso seria possível. Só estou esperando que algum nix guru barbudo apareça e exploda nossas mentes. Esse é o sonho de qualquer maneira.
CarpeNoctem
O que acontece se você experimenta um laptop conectado e retira o cabo Ethernet?
Paul
@ ~ drpaulbrewer - Exatamente o mesmo que quando você faz isso com uma máquina de mesa - a conexão é interrompida. Como a conexão é interrompida é irrelevante para a questão.
John Gardeniers

Respostas:

13

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

dannysauer
fonte
Estou achando difícil escolher uma resposta para aceitar, por isso estou aceitando essa porque, neste momento, é a única que tem um voto positivo.
John Gardeniers 18/03/10
5

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/

user215086
fonte
5
Bem-vindo à falha do servidor! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
EEAA
obrigado, @ user215086! Surpreendentemente, isso funcionou! Eu estava editando um longo arquivo de configuração por um tempo, adicionei várias configurações personalizadas e comentários cuidadosamente escritos e estava quase terminando quando a conexão caiu! "Nãããão !! ..." Depois que acabei de gritar palavrões no teto, instalei reptyr, et voila! Recuperei a sessão ssh exatamente onde a deixei ainda dentro do editor, terminei algumas coisas, salvei, terminei !! WooHoo! reptyr é incrível.
ColdCold
4

Geralmente, a maneira correta de lidar com isso é se preparar com antecedência, usando GNU screenou bash's nohupou disownmecanismos. Se você estiver usando tcsh, o shell rejeitará os trabalhos em segundo plano quando sair anormalmente.

Se você não estiver usando, screenmas conseguiu manter o processo em execução por meio de um dos métodos renegados , poderá reconectar-se ao processo com gdb( fonte ):

[...] com alguns hacks sujos, não é impossível reabrir um processo 'stdout / stderr / stdin. [...]

E, em seguida, use o gdb, por exemplo, para se conectar ao processo, faça algumas chamadas de fechamento (0)
chamada de fechamento (1)
chamada de fechamento (2)
chamada de abertura ("/ dev / pts / xx", ...)
chamada de dup (0)
chamar dup (0)
desanexar

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 .

charlatão quixote
fonte
1

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/filee a conexão morre. Você corre ssh somehostpara 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).

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

hlovdal
fonte
Obrigado. Isso é praticamente o que eu esperava. Vamos ver se alguém pode provar que estamos errados. ;)
John Gardeniers
Aprendi desde que escrevi esta resposta que existe um reptyr de programa para processos de "re-ptying". Em teoria, é factível, mas ainda acho que a resposta geral provavelmente não é.
Hlovdal
1

retty pode ajudá-lo, mas os avisos de isenção de responsabilidade são muito reais e relevantes :)

Evan Broder
fonte
1

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?

monomito
fonte
Eu estava perguntando em geral, mas estou mais interessado em quando um problema de rede faz com que uma conexão caia. No geral, eu diria que não está parecendo muito bom. Ainda assim, isso foi solicitado apenas por curiosidade, e não por necessidade. É sempre bom saber a resposta antes que você precise. ;)
John Gardeniers
uma conexão descartada não é um conceito simples, ao que parece. Você pode experimentar vários estágios diferentes. Por exemplo, você poderá desconectar o cabo de rede, conectá-lo novamente em alguns segundos e sua sessão SSH permanecerá ativa. Você não precisará reconectar para continuar, mesmo que tenha um pequeno atraso inicial. Se você se deparar com uma sessão ssh interrompida, isso significa que algo está configurado incorretamente (ou melhor, não está configurado corretamente para suportar esse tipo de interrupção).
monomito
0

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.

Kamil Kisiel
fonte
11
Também vale a pena investigar o comando de renúncia mencionado nas respostas a essa pergunta. Obrigado.
John Gardeniers