Como manter os processos em execução depois de terminar a sessão ssh?

469

Digamos que eu inicie um monte de processos de uma sessão ssh. É possível terminar a sessão ssh mantendo esses processos em execução na máquina remota?

    
por Olivier Lalonde 21.10.2010 / 14:09

14 respostas

553

Você deve procurar alternativas modernas, como tmux .

tmux é superior a screen por vários motivos, aqui estão alguns exemplos:

  • O Windows pode ser movido entre a sessão e até vinculado a várias sessões
  • O Windows pode ser dividido horizontalmente e verticalmente em painéis
  • Suporte para terminais UTF-8 e 256 cores
  • Sessões podem ser controladas a partir do shell sem a necessidade de entrar em uma sessão

Funcionalidade básica

Para obter a mesma funcionalidade, conforme explicado na resposta que recomenda screen , você precisa fazer o seguinte:

  • ssh na máquina remota
  • inicie tmux digitando tmux no shell
  • inicie o processo que você deseja dentro da sessão iniciada tmux
  • deixe / desanexar a sessão tmux digitando Ctrl + b e depois d

Agora você pode fazer logoff com segurança da máquina remota, o processo continuará sendo executado dentro de tmux . Quando você voltar e quiser verificar o status do seu processo, você pode usar tmux attach para anexar à sua sessão tmux .

Se você deseja ter várias sessões rodando lado a lado, você deve nomear cada sessão usando Ctrl + b e $ . Você pode obter uma lista das sessões atualmente em execução usando tmux list-sessions .

tmux pode fazer coisas muito mais avançadas do que manipular uma única janela em uma única sessão. Para mais informações, veja em man tmux ou a página do tmux GitHub . Em particular, aqui está uma FAQ sobre as principais diferenças entre screen e tmux .

    
por tongpu 23.11.2012 / 10:26
198

A melhor maneira é geralmente a mais simples.

nohup long-running-command &

Foi feito especificamente para isso, ele ainda registra stdout em nohup.log

man nohup

Se você quer "background" algumas tarefas já em execução, então sua melhor aposta é para ctrl + z, em seguida, executar

bg (isso fará o segundo plano de sua tarefa suspensa mais recente, permitindo que ela continue em execução)

então um disown rápido deve manter o processo em execução depois que você fizer logout.

screen e outros podem fazer isso, mas não é para isso que servem. Eu recomendo nohup para tarefas que você sabe que vai deixar para trás e bg para tarefas que você já está executando e não deseja reiniciar.

Tenha em mente que ambos são bash específicos. Se você não estiver usando o bash, os comandos poderão ser diferentes.

    
por coteyr 28.11.2012 / 03:58
173

Você poderia fazer isso usando screen .

Digite man screen para saber mais ou leia esta página do manual de tela .

Cenário simples:

  • ssh na sua caixa remota. Digite screen Em seguida, inicie o processo desejado.

  • Pressione Ctrl - A e depois em Ctrl - D . Isso "desconectará" sua sessão de tela, mas deixará seus processos em execução. Agora você pode sair da caixa remota.

  • Se você quiser voltar mais tarde, faça o logon novamente e digite screen -r . Isso "retomará" sua sessão de tela e você poderá ver a saída do seu processo.

por Lincoln 21.10.2010 / 14:20
70

Tela e nohup é a melhor maneira, mas se você tiver que desanexar um processo já em execução sem screen ou nohup você pode executar o comando disown.

  

disown [-ar] [-h] [ jobspec … | pid … ]

     

Sem opções, remova cada jobspec da tabela de tarefas ativas. Se a opção -h for fornecida, o trabalho não será removido da tabela, mas será marcado para que o SIGHUP não seja enviado ao trabalho se o shell receber um SIGHUP. Se jobspec não estiver presente e nem a opção -a nem -r for fornecida, o trabalho atual será usado. Se nenhum jobspec for fornecido, a opção -a significa remover ou marcar todos os trabalhos; a opção -r sem um argumento jobspec restringe a operação a tarefas em execução.

Com o disown você pode fechar o terminal e fazer o processo rodar na máquina.

    
por bassgey 21.10.2010 / 15:19
30

Eu estava preso em um grande mv, então eu não estava em posição de parar o processo, tela de configuração e, em seguida, iniciá-lo novamente. Eu consegui sair da sessão ssh com o processo em execução essencialmente fazendo os seguintes passos:

  1. ssh [servidor]
  2. comando
  3. CTRL + Z
  4. bg
  5. rejeitar
  6. sair

A etapa 3 pausa o processo atual (por exemplo, meu comando 'mv'). A etapa 4 coloca o processo pausado em segundo plano e o resume. A etapa 5 permite que você ignore o processo.

    
por Chaos 25.11.2013 / 04:30
19

Existem dois programas principais que você pode usar para manter os programas e o estado do terminal em várias conexões ssh. Eles são tela (o encarregado, mas infelizmente não mantido. Aparentemente que é ativamente desenvolvido agora ) e tmux (mais recente, mantido ativamente). Byobu é um front-end que pode ser executado em cima de seus sistemas e oferecer informações adicionais sobre o status do ubuntu. Em novas instalações, ele usará o tmux como backend, se você tiver uma instalação mais antiga do byobu e uma configuração existente, ele manterá o backend anterior, seja o screen ou o tmux.

Byobu

O Byobu pode ser instalado no computador fazendo isso em uma máquina baseada no Debian:

sudo aptitude install byobu

Usando o yum, você faz

su -c 'yum install byobu'

Também é possível instalar o byobu em outras distribuições.

Usando byobu

Você pode iniciar o byobu executando byobu na máquina host depois de conectar usando o ssh. Isso lhe dará um shell parecido com isto:

Você também pode usar o Byobu Terminal em uma máquina Ubuntu com a opção -X e facilmente ter um byobu perfeitamente funcional.

Uso:

Inicie o byobu digitando byobu .

Você pode pressionar F2 para criar uma nova janela dentro da sessão atual, F3-F4 para alternar entre as várias janelas.

A melhor parte sobre o byobu é que você não precisa realmente matar os processos em execução no terminal para sair do terminal. Você pode simplesmente enviar screen / tmux (o esqueleto de byobu) para background e continuar da próxima vez que você vier:

  • Para deixar o byobu e mantê-lo em execução (desanexe) pressione F6.
  • Da próxima vez que você vier, basta byobu e você voltará para onde você estava.

Você também pode criar várias sessões byobu por byobu -S session1 e assim por diante. E você pode se conectar a qualquer um deles quando voltar.

Você pode fazer muito mais usando o Byobu. Use-o! Alguns guias definitivos são aqui , aqui ou aqui .

    
por SiddharthaRT 24.11.2012 / 23:09
16

Você não pode fazer isso uma vez que o processo tenha iniciado, você precisa ter configurado as coisas antes de executar um trabalho de longa duração.

Você pode usar nohup , mas a sabedoria moderna sugere que você use a tela ou o byobu como seu login para que você possa separar e deixar as coisas corrida.

A tela tem a vantagem de você poder desanexar de uma máquina e reconectar-se a outra que é útil se você quiser verificar processos de execução longa que vão além do final do dia de trabalho.

Existe um guia de introdução / a> aqui.

byobu coloca uma interface fácil de usar em cima da tela com menus etc. Também é a implementação atual da tela no ubuntu mais novo. F2 para iniciar um novo terminal F3 / F4 para alternar para frente e para trás e F6 para desconectar. Digite exit para finalizar os terminais permanentemente.

    
por Richard Holloway 21.10.2010 / 14:16
7

Ei, enquanto eu concordei que a tela é a opção mais eficaz. Você pode usar o vncserver e depois iniciar o processo nele.

Além disso, se o seu único interesse é ter o processo em execução e não precisar assumir o controle, e o mais importante que você não sabia, você teria que fechar a sessão e o processo já estava em execução. de sorte se você usou bash como o shell

Primeiro você precisa enviar o processo para o plano de fundo digitando Ctrl + Z seguido por bg% 1 (o número depende do número do trabalho, geralmente é 1, mas você pode facilmente puxar a lista usando os trabalhos de comando)

Finalmente invoque o comando disown (seguido pelo jobid ... igual ao comando bg)

Isso removerá o relacionamento pai-filho entre o seu shell e o processo em segundo plano, evitando que ele morra quando seu shell for finalizado.

    
por Jorge Gutierrez 06.06.2011 / 23:29
6

Para um único script de shell que estou executando por um longo período de tempo, faço login e executo o processo em segundo plano usando '& amp;'.

Exemplo:

/path/to/my/script &

Eu fiz logout e desconectei minha sessão SSH. Quando eu fizer login mais tarde, o script ainda está sendo executado, conforme comprovado pela coleta contínua de dados do script.

    
por user108430 29.07.2014 / 16:58
3

Você deve conferir GNU Screen e ver se ele ajuda você. Dependendo de como você precisa que seu aplicativo seja executado em tempo real, isso pode causar mais problemas do que resolve, mas, pelo menos, permitirá que você retome sua sessão como se nunca a tivesse deixado.

Como usar:

  • Use o comando screen para o primeiro começo, percorra as mensagens de introdução, você deve receber um terminal.
  • C-a C-c abre outro terminal
  • C-a C-k mata um terminal
  • Você pode usar C-a C-Space e C-a C-Backspace para percorrer terminais
  • C-a C-a é útil se você estiver usando principalmente apenas dois terminais
  • C-a C-d desanexa a sessão de tela atual e sai das telas. Você pode então usar screen -r para continuar essa sessão. Você pode ter várias sessões de tela desanexadas de uma vez, neste caso, você verá uma lista de sessões disponíveis.

Existem muitas outras opções, por exemplo, ecrãs divididos, e todos os atalhos são totalmente personalizáveis.

    
por T. Verron 22.05.2012 / 17:31
2

Resposta mais simples ...

ctrl + z suspenderá o programa em execução

"bg" será executado em segundo plano

    
por Roop 13.08.2013 / 02:28
2

A maneira mais fácil é executar seu comando em segundo plano com & . Então, basta escrever:

disown -a
    
O
por Zibri 11.01.2017 / 04:52
0

Enquanto todos dizem para usar disown (a única opção que você tem depois de iniciar o processo), nohup , ou até mesmo executar o comando em screen , que é útil se você quiser ver todos os resultados a partir do comando ... Eu sou um fã de screen .. Eu ainda tentei distribuições mainstream mais recentes do Linux e simplesmente colocando o trabalho em segundo plano e sair não faz com que todos os processos que estão em execução para morrer. Deve haver um cenário global ou algo assim. Eu estou tentando isso em alguns sistemas bastante antigos (slackware 12) e meu script de teste continua em execução até que eu o mate manualmente:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Embora eu concorde que screen seria a melhor maneira de executar isso, mesmo que meu script tenha sido gravado em arquivos de log ou qualquer outra coisa. Nunca precisei usar disown -a ou nohup a menos que estivesse fora de paranóia completa. Talvez alguém possa esclarecer como o bash se comporta por padrão? Talvez alguns administradores de sistema alterem os padrões em grandes shells para impedir que os processos de seus usuários sobrecarreguem o sistema?

    
por Dan Gullage 29.07.2015 / 19:42
-1

Em vez de:

cmd options; 

Adicione antes de nohup :

nohup cmd options & 

Em seguida, você poderá ver o stdout do console:

tail -f nohup.out
    
por Abdennour TOUMI 22.10.2016 / 12:51

Tags