Mantenha as sessões SSH em execução após a desconexão

208

Às vezes, tenho processos de execução longa que quero iniciar antes de ir para casa, por isso crio uma sessão SSH no servidor para iniciar o processo, mas quero fechar meu laptop e voltar para casa e, depois do jantar, quero verifique o processo que iniciei antes de sair do trabalho. Como posso fazer isso com o SSH? Meu entendimento é que, se você interromper sua conexão SSH, também interromperá sua sessão de login no servidor, interrompendo, portanto, o longo processo de execução.

λ Jonas Gorauskas
fonte

Respostas:

205

Use nohuppara fazer com que seu processo ignore o sinal de desligamento:

$ nohup long-running-process &
$ exit
Warren Young
fonte
20
É isso. Não há necessidade de instalar a tela ou tmux. Esta é realmente a boa e velha maneira de fazê-lo. Claro que 'screen' ou 'tmux' são aplicativos maravilhosos e devem ser usados ​​quando necessário, mas tão simples quanto executar um processo em segundo plano no qual você pode sair, vá para o acima.
reiche 14/08/10
2
é nohup como deserdado?
cjac
28
Eles têm propósitos semelhantes, mas diferem de várias maneiras. nohupintercepta o SIGHUP para que, quando o shell que o executou, saia e envie o SIGHUP para todos os seus filhos ainda em execução, long-running-processnão morra. disownsimplesmente remove o trabalho especificado da lista de filhos de Bash, para que ele não tente enviar o SIGHUP. nohupé um programa separado do shell, portanto, funciona com todos os shells, enquanto que disowné um Bash embutido. nohupaceita o comando para execução, enquanto que disownsó funciona após o trabalho ser iniciado e você o coloca em segundo plano para que possa voltar ao shell.
Warren Young
3
Revisão rápida impressionante para aqueles que não estão familiarizados com nohup e renegar - bem como algumas maneiras fáceis de lidar com sessões de terminal serverwatch.com/tutorials/article.php/3935306/...
Dan
7
tail -f nohup.outpara verificar o que está acontecendo quando você voltar.
Ricardo Stuven 3/16
141

Você quer usar o GNU Screen. É super incrível!

ssh [email protected]
screen               #start a screen session
run-a-long-process

CTRL+ a, dpara se destacar da sua sessão na tela

exit                 #disconnect from the server, while run-a-long-process continues

Quando você volta ao seu laptop:

ssh [email protected]
screen -r            #resume the screen session

Então confira o andamento do seu processo de longa execução!

screené uma ferramenta muito abrangente e pode fazer muito mais do que eu descrevi. Enquanto estiver em uma sessão de tela, tente ctrl + a ,? para aprender alguns comandos comuns. Provavelmente os mais comuns são:

  • CTRL+ a, cpara criar uma nova janela
  • CTRL+ a, npara mudar para a próxima janela na sua sessão de tela
  • CTRL+ a, ppara mudar para a janela anterior na sua sessão de tela
  • se você fizer login a partir de vários sistemas diferentes, pode ter se deixado acidentalmente conectado a uma sessão de tela ativa em outro computador. por esse motivo, sempre recomeço com screen -d -rpara garantir que, se outro shell estiver conectado à minha sessão de tela, ele será desanexado antes de continuar no meu sistema atual.
Sandy
fonte
8
O tmux é um análogo moderno da tela.
Zvolkov
Eu não sei o que é moderno, mas o prefixo de chave padrão do tmux (Ctrl + b) ajuda se você estiver acostumado a bash / emacs keys.
sajith
2
a tela é bem legal se você quiser um terminal compartilhado por algum motivo. Crie uma tela screen -S namee deixe seu outro amigo se conectar a ela screen -x name.
Patrick
1
tmuxwith tmuxinatoré uma ótima combinação para configurações sofisticadas, enquanto eu prefiro screencomo uma solução rápida e simples.
earthmeLon
Essa resposta é a melhor. Gostei. Excelente pesquisa
Jaffer Wilson
42

Se você não tiver planejado com antecedência e configurado screen, etc., faça o seguinte:

  1. Se o seu processo estiver em execução em segundo plano: vá para o 3, caso contrário: Ctrl-Zsuspenda o processo em primeiro plano. Isso informará o número da tarefa do processo suspenso, por exemplo:

    [1]+  Stopped                 processName
    
  2. Envie processNamepara o segundo plano com bg %1(usando o número de trabalho que está seguindo o %). Isso será retomado processNameem segundo plano.

  3. Rejeite processName com disown %1ou disown PID. Use o -hsinalizador se desejar manter a propriedade até encerrar seu shell atual.

Mike Covington
fonte
5
Obrigado por isso! Eu tinha um emprego funcionando e pensei que não seria capaz de continuar porque não tinha usado &quando o iniciei. Isso parece funcionar muito bem!
27512 Matt
4
Isso é incrível! Eu nunca soube que o Linux poderia permitir que você transferisse o controle de processos ativos como este. Eu estava com medo de que minha bateria morresse enquanto fazia o SSH no meu servidor no meio de um processo demorado, e essa era a resposta para mim!
Plutão
14

O que você deseja usar é a tela ou, melhor ainda, um invólucro fácil de usar na tela chamado byobu.

Tela permite executar várias sessões de terminal virtual na mesma sessão ssh. Um tutorial e páginas de ajuda estão disponíveis.

O byobu é um invólucro que permite abrir facilmente novas telas com uma simples tecla de função em vez da combinação de teclas de ctrl-a. Também mostra uma linha de status com todos os terminais virtuais abertos que podem ser nomeados.

Outro recurso interessante é o fato de que toda a tela pode permanecer ativa enquanto a conexão ssh estiver desconectada. Você acabou de se conectar novamente via ssh e chamar byobu e tudo está como antes.

Finalmente algumas capturas de tela do byobu.

txwikinger
fonte
Lancei um processo no meu servidor no Byobu Terminal sem realmente saber o que era (eu apenas procurei no Terminal e cliquei no Byobu porque nunca o tinha visto antes). Continuei usando o Byobu porque tinha uma barra de status colorida na parte inferior e achei legal. Hoje me vi querendo acessar a sessão do terminal remotamente através do SSH. Tudo o que eu precisava fazer era digitar "byobu" e isso mostrava a sessão do terminal imediatamente. Muito feliz, eu tropecei no byobu!
nick
8

Pode valer a pena notar que

ssh -t lala screen -rxU mooserá anexado à sessão MOO no host lala

ssh -t lala screen -S moocriará a sessão MOO no host lala

e

ssh -t lala screen -S moo quuxcriará a sessão MOO no host lala e executará o programa quux , encerrando a sessão após a conclusão.

cjac
fonte
3

Pergunta antiga, estranha ainda ninguém aconselhou o tmux , que funciona como um invólucro para n consoles e os mantém abertos até que seja necessário. Isso permite mais controle, além de várias funções que o tmux possui. É fácil gerenciá-lo, basta executar o tmux, que o traz em seu shell, iniciar seu trabalho mais demorado, depois pressionar ctrl + b seguido de d (desanexar) ( ctrl+bé o "ok google" do tmux e dé o comando para fechar sem saída do shell). Isso realmente funciona se você apenas fechar, por exemplo, massa de vidraceiro. Após o jantar, quando você se conectar novamente, poderá reabrir o tmux tmux attachpara ver sua tela exatamente como saiu. Algo que amo é o painel de divisão: ctrl+be pressione ". Para mudar de um painel para outro ctrl+be pressione a seta para cima / para baixo.

nnsense
fonte
3

Você pode encontrar um bom guia aqui: Mantenha sua sessão SSH em execução ao desconectar

sudo apt-get install screen

Agora você pode iniciar uma nova sessão de tela digitando a tela na linha de comando. Você verá algumas informações sobre a tela. Pressione enter e você estará em um prompt normal.

Para desconectar (mas deixar a sessão em execução) Pressione Ctrl+ Ae depois Ctrl+ Dem sucessão imediata. Você verá a mensagem [desanexada]

Para reconectar-se a uma sessão já em execução

screen -r

Para reconectar-se a uma sessão existente ou criar uma nova, se nenhuma existir

screen -D -r

Para criar uma nova janela dentro de uma sessão de tela em execução Hit Ctrl+ Ae, Cem seguida, em sucessão imediata. Você verá um novo prompt.

Para passar de uma janela de tela para outra Hit Ctrl+ Ae, em seguida, Ctrl+ Aem sucessão imediata.

Para listar janelas de tela aberta Hit Ctrl+ Ae, Wem seguida, em sucessão imediata

Victor Hugo Arango A.
fonte
Você pode usar <kbd>Ctrl</kbd>para mostrar os nomes como teclas do teclado.
Tomasz
1

Eu uso o NX NoMachine, que é gratuito para mim porque sou apenas eu. Essencialmente, ele executa uma sessão X no servidor à qual você pode se conectar e desconectar repetidamente. A sessão X continua em execução quando você não está conectado. As conexões podem ser feitas de qualquer lugar. Você pode escolher entre janelas flutuantes ou uma única janela contendo toda uma área de trabalho (por exemplo, uma área de trabalho completa do Gnome). O cliente (que você executaria no seu laptop) pode ser executado no Linux, MacOS, Solaris ou Microsoft Windows. Neste último caso, se você escolher janelas flutuantes, elas aparecerão individualmente na barra de tarefas do Windows.

Uso meu laptop com Windows XP (necessário para um hardware específico do Windows) como front-end para meus dois servidores Linux usando o NX Nomachine. Posso até imprimir na impressora conectada ao meu laptop Windows a partir do Linux.

Rob_before_edits
fonte