Como manter os processos em execução após o término da sessão ssh?

Digamos que eu inicie vários processos de uma sessão ssh. É possível encerrar a sessão ssh enquanto mantém esses processos em execução na máquina remota?

Você deve procurar alternativas modernas como tmux.

tmux é superior a screen por muitas razões, aqui estão apenas alguns exemplos:

  • As janelas podem ser movidas entre a sessão e até mesmo vinculadas a várias sessões
  • As janelas podem ser divididas horizontal e verticalmente em painéis
  • Suporte para terminais de cores UTF-8 e 256
  • As sessões podem ser controladas a partir do shell sem a necessidade de inserir uma sessão

Funcionalidade Básica

Para obter a mesma funcionalidade explicada no resposta recomendar screen, você precisaria fazer o seguinte:

  • ssh na máquina remota
  • Comece tmux digitando tmux dentro da concha
  • Inicie o processo que você deseja dentro do started tmux sessao
  • deixar / desanexar o tmux sessão digitando Ctrl+b e então d

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

Se você quiser ter várias sessões em execução lado a lado, você deve nomear cada sessão usando Ctrl+b e $. Você pode obter uma lista das sessões em execução usando tmux list-sessions, agora anexar a uma sessão em execução com comando tmux attach-session -t <session-name>.

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

Opção 1: nohup

A melhor maneira é muitas vezes a mais simples.

nohup long-running-command &

Foi feito especificamente para isso, ele até registra stdout para nohup.log.

man nohup

Opção 2: bg + disown

ctrl+zbgdisown -h

Se você quiser & quot; fundo & quot; já executando tarefas, então Ctrl+Z executar bg para colocar sua tarefa suspensa mais recente em segundo plano, permitindo que ela continue em execução. disown irá manter o processo em execução depois de sair. O -h o sinalizador impede o desligamento.


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.

Lembre-se de que ambos são específicos do bash. Se você não estiver usando o bash, os comandos podem ser diferentes.

Você poderia fazer isso usando screen.

Tipo man screen para saber mais ou ler este página do manual da tela.

Cenário simples:

  • ssh em sua caixa remota. Tipo screen Em seguida, inicie o processo desejado.

  • Premir Ctrl-A entao Ctrl-D. Isso "desanexará" 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 logon novamente e digite screen -r Isso "retomará" sua sessão de tela e você poderá ver a saída do seu processo.

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

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

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

Com disown você pode fechar o terminal e obter o processo em execução na máquina.

Eu estava preso em um mv grande, então não estava em posição de interromper o processo, configurar a tela e iniciá-lo novamente. Consegui sair da sessão SSH com o processo em execução essencialmente fazendo as seguintes etapas:

  1. Estabelecer conexão SSH: ssh user@host
  2. Execute o comando desejado para iniciar o processo
  3. Premir Ctrl+Z para pausar o processo
  4. Executar bg para colocar o processo Pausado em segundo plano e retomá-lo.
  5. Executar disown [pid] (o ID do processo é opcional, o padrão é o último processo) para rejeitar o processo. Para obter uma lista de trabalhos, basta digitar jobs antes.
  6. Saia da sessão SSH executando logout.

Uso do disown comando:

disown [-ar] [-h] [jobspec ... | pid ... ]              Without  options,  remove  each jobspec from the table of active              jobs.  If jobspec is not present, and neither the -a nor the  -r              option  is  supplied, the current job is used.  If the -h option              is given, each jobspec is not removed from  the  table,  but  is              marked  so  that  SIGHUP  is  not  sent  to the job if the shell              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option              means  to  remove or mark all jobs; the -r option without a job‐              spec argument restricts operation to running jobs.   The  return              value is 0 unless a jobspec does not specify a valid job.

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 screen (O titular, mas infelizmente não mantidos. Aparentemente sendo 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 de status do ubuntu. Em novas instalações, ele usará o tmux como back-end, se você tiver uma instalação mais antiga do byobu e uma configuração existente, ele manterá o back-end anterior, seja screen ou tmux.

Byobu

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

sudo aptitude install byobu

Usando 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 após a conexão usando ssh.Isso lhe dará um shell parecido com este:

image-byobu

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

Uso:

Comece 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 do 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 o fundo e retomar a próxima vez que você vier:

  • Para deixar byobu e mantê-lo em execução (desanexar) pressione F6.

  • Da próxima vez que você vier, apenas faça byobu e você deve estar de volta exatamente onde estava.

    byobu-detach-attach

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 Byobu. Use-o!Alguns guias definitivos são aqui, ou aqui.

Você não pode fazer isso depois que o processo for iniciado, você precisa configurar as coisas antes de executar um trabalho de longa execução.

Você pode usar nohup mas a sabedoria moderna sugere que você use screen ou byobu como seu login para que você possa desconectar e deixar as coisas funcionando.

A tela tem a vantagem de que você pode se desconectar de uma máquina e reconectar de outra, o que é útil se você quiser verificar os processos de longa execução que são executados além do final do dia útil.

Há uma introdução razoável guia para a tela aqui.

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

Para um único script de shell que tenho executado por um longo período de tempo, vou fazer o login e executar o processo em segundo plano usando '&'.

Exemplo:

/path/to/my/script &

Eu desconectei e desconectei minha sessão SSH. Quando eu entro algum tempo depois, o script ainda está sendo executado conforme comprovado pela coleta contínua de dados do script.

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

Além disso, se o seu único interesse é ter o processo em execução e não há necessidade de assumir o controle de volta dele, e totalmente mais importante que você não estava ciente de que você vai precisar para fechar a sessão e você tem o processo já em execução, você não é de sorte se você usou bash como o shell

Primeiro você precisa enviar o processo para segundo plano 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 o comando jobs)

Finalmente, invoque o comando disown (seguido pelo jobid ... o mesmo que com o comando bg)

Isso removerá a relação pai-filho entre seu shell e o processo em segundo plano, evitando que ele morra quando seu shell for encerrado.

Você deve verificar Tela GNU e veja se isso ajuda você. Dependendo de como você precisa que seu aplicativo seja executado em tempo real, ele 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 a primeira partida, 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 os terminais
  • C-a C-A é útil se você estiver usando principalmente apenas dois terminais
  • C-A C-d separa a sessão de tela atual e sai das telas. Você pode então usar screen -r para retomar essa sessão. Você pode ter várias sessões de tela destacadas ao mesmo tempo, neste caso, você verá uma lista de Sessões disponíveis.

Existem muitas outras opções, por exemplo, telas divididas, e também todos os atalhos são totalmente personalizáveis.

Relacionados: How can I run a command which will survive terminal close? - Unix & Linux Stack Exchange