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


Vamos dizer que eu lanço um monte de processos de uma sessão ssh. É possível terminar a sessão ssh enquanto mantém esses processos em execução na máquina remota?


507
2017-10-21 12:09


origem


Relacionado: unix.stackexchange.com/questions/4004/… - Anton Tarasenko


Respostas:


Você deve procurar alternativas modernas como tmux.

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

  • O Windows pode ser movido entre a sessão e até mesmo 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
  • As 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 no responda recomendando screen, você precisaria fazer o seguinte:

  • ssh na máquina remota
  • começar tmux digitando tmux na casca
  • iniciar o processo que você quer dentro do iniciado tmux sessão
  • deixe / retire o tmux sessão digitando Ctrl+b e depois d 

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

Se você quiser 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, agora anexar a uma sessão em execução com o comando tmux attach-session -t 0.

tmux pode fazer coisas muito mais avançadas do que manipular uma única janela em uma única sessão. Para mais informações dê uma olhada 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.


597
2017-11-23 09:26



@CraigM Use screen -x -r [screenname] ou screen -rx para breve, se você tiver apenas uma sessão de tela ativa. Isso permite que você anexe uma instância de tela existente. - Lekensteyn
Este conselho me ajudou com o mesmo problema, mas acho que inclui um erro de digitação. Tenho certeza que você precisa digitar Ctrl-b e depois d a fim de deixar / destacar o tmux sessão. Certamente esse é o caso da versão do tmux no meu Ubuntu 12.04. - cxrodgers
Eu cometi um erro ao seguir as instruções acima. Compartilharei se alguém cair no mesmo erro: Iniciei o tmux no shell do meu próprio computador em vez do shell do computador remoto. É preciso iniciar o tmux no shell do computador remoto. - Mert Nuhoglu
A tela está sendo desenvolvida novamente: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Você poderia atualizar sua resposta? - muru
Como alternativa, corra tmux detach em vez de digitar ctrl-b d - Andrew MacFie


A melhor maneira é geralmente a mais simples.

nohup long-running-command &

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

man nohup

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

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

então um rápido disown deve manter o processo em execução após o 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 quer recomeçar.

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


217
2017-11-28 02:58



Eu recomendaria fazer disown -h - Michele
Curiosamente tela e tmux não funciona para mineiro, bur nohup funciona - Yasin Okumuş
bg + disownnão funcionou para mim. Eu tinha um script de implementação em execução que esqueci de iniciar dentro do tmux e precisava sair cedo para uma reunião. O script continuamente produz progresso para o shell. ctrl+z Parei o processo, voltando-me para bater. bg Retomado o processo, mas também retomou a saída do status para bash, tornando impossível ver o que eu estava digitando. No entanto, um disown comando produzido "disown: current: no such job" - BrianHVB


Você poderia fazer isso usando screen.

Tipo man screen para saber mais ou ler isto página de homem de tela.

Cenário simples:

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

  • pressione Ctrl-UMA então 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 login novamente e digite screen -r Isso "retomará" sua sessão de tela e você poderá ver a saída do seu processo.


179
2017-10-21 12:20



Eu geralmente nomeio minhas sessões de tela usando screen -S name para facilitar a conexão com a correta posteriormente. - David Oneill
O link está inativo - Gab是好人
Pessoalmente, estou trabalhando em uma caixa sem nenhum software de controle de pacotes. Depois de passar cerca de meia hora construindo dependências para o TMUX (que eu pessoalmente tenho experiência com e como) da fonte, ficou claro que a tela era a solução melhor e mais simples para mim. TL; DR: a solução ideal para esse problema depende do caso de uso, da máquina e de quanto tempo você precisa configurar. Obrigado por esta resposta :) - Max von Hippel
Combinação com screen -S antes de sair e screen -r quando voltar é incrível! - Meloman
Obrigado por isso. Esta solução funcionou para mim enquanto o tmux não (eu uso uma versão do bash para windows enquanto ssh'e em uma máquina linux) - Michael Sorensen


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 trabalhos ativos. Se o -h opção é dada, o trabalho não é removido da tabela, mas é marcado para que o SIGHUP não seja enviado para o trabalho se o shell receber um SIGHUP. E se jobspec não está presente, e nem o -a nem o -r opção é fornecida, o trabalho atual é usado. Se não jobspec é fornecido, o -a opção significa remover ou marcar todos os trabalhos; a -r opção sem um jobspec argumento restringe a operação para executar trabalhos.

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


72
2017-10-21 13:19



Esta é também a minha maneira favorita de fazer isso. Eu uso freqüentemente disown -a && exit - Stefano Palazzo♦
Perfeito. Este é um lindo comando e merece todos os votos positivos! - Greg
uma palavra de cautela, parei um processo em execução com Ctrl-Z e não iniciei em segundo plano antes de chamar disown e isso matou. - HDave
Pode falhar se quiser gravar no terminal. Redirecionar a saída de um processo em execução não é tão fácil. Melhor começar corretamente com nohup. - jiggunjer
Essa é uma boa resposta, porque responde diretamente à pergunta. O autor da pergunta perguntou o que fazer depois de tendo já executado um monte de comandos de longa duração. A maioria dessas respostas permite que você saiba o que fazer antes você executa os comandos. - q0rban


Eu estava preso em um grande mv, então eu não estava em condições 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. negar
  6. Saída

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.


37
2017-11-25 03:30



Built-in são sempre minha primeira escolha :) THX - ken_oy
Essa resposta deve ser marcada como certa. Para instalar e se acostumar a tela para resolver este problema é exagerado. - Ulrich-Lorenz Schlüter
Isso é muito útil quando você já iniciou qualquer comando e está sendo executado por muito tempo. Terminar e iniciar em uma sessão TMUX levará tempo - Deepali Mittal


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 incumbente, mas infelizmente não mantido. 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 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 começar byobu executando byobu na máquina host depois de conectar usando o ssh. Isso lhe dará um shell que se parece com isso:

image-byobu

Você também pode usar o Byobu Terminal 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 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 funcionando (desconecte) pressione F6.
  • Da próxima vez que você vier, apenas faça byobu e você deve estar de volta onde estava.

    byobu-detach-attach

Você também pode criar várias sessões de byobu 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.


19
2017-11-24 22:09



Eu tentei usar o byobu de uma sessão baseada no PuTTY para minha caixa do Ubuntu, mas recebo a linha de status repetida e rolando na tela. Embora tenha sido removido adequadamente quando pressionado o F6, não foi uma solução utilizável na minha configuração. - jfmessier
@jfmessier É porque o PuTTY não usa ncurses (utf-8 basicamente) bem. É possível eliminar esse problema seguindo este segmento - stackoverflow.com/questions/10731099/… - SiddharthaRT
Isso é incrível! 1. Ele me dá um prompt bash colorido que eu não consigo ativar com bash como meu shell padrão e 2. Eu consigo executar 2 bots ao mesmo tempo e ainda tem outro terminal para trabalhar! @SiddharthaRT você merece um senhor upvote! - Dev


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 tela ou byobu como seu login para que você possa separar e deixar as coisas funcionando.

Tela tem a vantagem que você pode desanexar de uma máquina e reconectar a partir de outra que é útil se você quiser verificar em processos de longa execução que executam além do final do dia de trabalho.

Existe um começo razoável guia para 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 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.


16
2017-10-21 12:16



byobu usa o tmux hoje em dia .. - scottl
"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." - não, você pode usar disown Para alcançar isto. Veja a resposta de @ bassgey - Rich
depois de lutar para aprender tela e tmux .... byobu trouxe lágrimas aos meus olhos - HDave
disown e se necessário apenas Ctrl-z, então bg para obtê-lo do terminal ativo e para o fundo. Então, disown. - mimoralea


Ei, enquanto eu concordei que a tela é a opção mais efetiva. 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ê precisaria fechar a sessão e ter o processo já em execução, você não terá sorte se você usou bash como o shell

Primeiro você precisa enviar o processo para o plano de fundo digitando Ctrl + Z seguido de 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 seu shell e o processo em segundo plano, evitando que ele morra quando seu shell for finalizado.


7
2018-06-06 21:29



Essa resposta é a melhor! Por que todo mundo está falando screen, a questão foi colocada evento pós-login, como manter os processos em execução, agora após o login, mas antes de iniciá-los. Ótima resposta Jorge, você realmente me ajudou! :) - jwbensley
Simplesmente bg (sem %1) geralmente é suficiente, já que o padrão é o trabalho atual - Walter Tross
Seria bom ter uma resposta abrangente: A priori (configuração prévia): tela do terminal ascii (antiga), tmux (neewer); X windows: vnc (antigo, ainda mantido), xpra (mais recente), com xpra sendo sem raiz. Um posterior (persistindo depois que você começou): ^ Z, renegar, ... Mas eu sou muito preguiçoso para fazer mais do que isso. - Krazy Glew