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

644

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

Olivier Lalonde
fonte
2
Relacionados: unix.stackexchange.com/questions/4004/...
Anton Tarasenko

Respostas:

750

Você deve procurar alternativas modernas como tmux.

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

  • O Windows pode ser movido entre as sessões e até vinculado a várias sessões
  • O Windows pode ser dividido horizontal 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 na resposta que recomenda screen, você deve fazer o seguinte:

  • ssh na máquina remota
  • comece tmuxdigitando tmuxno shell
  • inicie o processo desejado dentro da tmuxsessão iniciada
  • sair / desanexar a tmuxsessão digitando Ctrl+ be depoisd

Agora você pode fazer logoff com segurança da máquina remota, seu processo continuará sendo executado dentro tmux. Quando você volta e deseja verificar o status do seu processo, pode usar tmux attachpara anexar à sua tmuxsessão.

Se você deseja ter várias sessões em execução lado a lado, deve nomear cada sessão usando Ctrl+ be $. Você pode obter uma lista das sessões actualmente em execução usando tmux list-sessions, agora atribuem a uma sessão de corrida com o comando tmux attach-session -t 0.

tmuxpode 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 no man tmuxou na página GitHub tmux . Em particular, aqui está uma FAQ sobre as principais diferenças entre screene tmux.

tongpu
fonte
4
@CraigM Use screen -x -r [screenname]ou abrevie screen -rxse você tiver apenas uma sessão de tela ativa. Isso permite anexar uma instância de tela existente.
Lekensteyn
5
Esse conselho me ajudou com o mesmo problema, mas acho que inclui um erro de digitação. Tenho certeza de que você precisa digitar Ctrl-be depois dsair / desanexar a tmuxsessão. Certamente esse é o caso da versão do tmuxmeu Ubuntu 12.04.
Cxrodgers
17
Cometi um erro ao seguir as instruções acima. Vou compartilhá-lo se alguém cair no mesmo erro: iniciei o tmux no shell do meu próprio computador, em vez do shell do computador remoto. É necessário iniciar o tmux no shell do computador remoto.
Mert Nuhoglu
5
A tela agora está sendo desenvolvida novamente: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Você poderia atualizar sua resposta?
Muru
4
Como alternativa, execute em tmux detachvez de digitar #ctrl-b d
Andrew Andrew
305

Opção 1: nohup

A melhor maneira é geralmente a mais simples.

nohup long-running-command &

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

man nohup

Opção 2: bg

Se você deseja "colocar em segundo plano" algumas tarefas já em execução, sua melhor aposta é Ctrl+ e, em Zseguida, execute

bg

colocar sua tarefa suspensa mais recente em segundo plano, permitindo que ela continue em execução.

Em seguida, um processo rápido disowndeve manter o processo em execução após o logout.

screene outros podem fazer isso, mas não é para isso que servem. Eu recomendo nohuppara tarefas que você sabe que vai deixar para trás e bgpara 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 poderão ser diferentes.

coteyr
fonte
4
Eu recomendaria fazerdisown -h
Michele
Curiosamente tela e tmux não funciona para mineiro, bur nohup funciona
Yasin Okumus
1
bg+ disownnão funcionou para mim. Eu tinha um script de implantação em execução, esqueci de iniciar o tmux e precisava sair mais cedo para uma reunião. O script gera continuamente progresso para o shell. ctrl+zparou o processo, retornando-me para o bash. bgretomou o processo, mas também retomou a saída do status para o bash, tornando impossível ver o que eu estava digitando. No entanto, um disowncomando produziu "disown: current: no job"
BrianHVB
isso não funcionou para mim julia myFile.jlpor qualquer motivo. O tmux faz e é ótimo.
kilgoretrout
Isso funcionou para mim, muito obrigado
Chad
207

Você poderia fazer isso usando screen.

Digite man screenpara descobrir mais ou leia esta página de manual da tela .

Cenário simples:

  • ssh em sua caixa remota. Digite screenEm seguida, inicie o processo que você deseja.

  • Pressione Ctrl- e Adepois Ctrl- D. Isso "desanexará" sua sessão da 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 -rIsso "retomará" sua sessão de tela e você poderá ver a saída do seu processo.

Lincoln
fonte
32
Geralmente, nomeio minhas sessões de tela screen -S namepara facilitar a conexão com a correta mais tarde.
David Davill
O link está em baixo
Gab是好人
1
Pessoalmente, estou trabalhando em uma caixa sem nenhum software de controle de pacote. Depois de passar cerca de meia hora criando dependências para o TMUX (com as quais pessoalmente tenho experiência e gosto) a partir 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 para configurar. Obrigado por esta resposta :)
Max von Hippel
Combinar com screen -Santes de sair e screen -rquando voltar é incrível!
Meloman
Obrigado por isso. Esta solução funcionou para mim enquanto tmux não (eu uso uma versão do bash para janelas enquanto ssh'ing em uma máquina linux)
Michael Sorensen
83

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

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

Sem opções, remova cada especificação de trabalho da tabela de tarefas ativas. Se a -hopção for dada, 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 o jobspec não estiver presente e -anem a -ropção for fornecida, o job atual será usado. Se nenhuma especificação de trabalho for fornecida, a -aopção significa remover ou marcar todas as tarefas; a -ropção sem o argumento jobspec restringe a operação à execução de jobs.

Com a renúncia, você pode fechar o terminal e executar o processo na máquina.

bassgey
fonte
10
Esta é também a minha maneira favorita de fazê-lo. Eu uso frequentementedisown -a && exit
Stefano Palazzo
1
Perfeito. Este é um comando adorável e merece todos os votos positivos!
Greg
8
Por uma palavra de cautela, parei um processo em execução com Ctrl-Z e não o iniciei em segundo plano antes de ligar disowne o interrompeu .
HDave 23/09
3
Pode travar se desejar gravar no terminal. Redirecionar a saída de um processo em execução não é tão fácil. Melhor iniciá-lo corretamente com nohup.
Jggunjer
2
Esta é uma boa resposta, porque responde diretamente à pergunta. O autor da pergunta perguntou o que fazer depois de já ter executado vários comandos de execução longa. A maioria dessas respostas permite que você saiba o que fazer antes de executar os comandos.
precisa saber é o seguinte
53

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

  1. ssh [servidor]
  2. comando
  3. Ctrl+Z
  4. bg
  5. rejeitado [processo pid opcional, o padrão é o último]
  6. Saída

O passo 3 pausa o processo atual (por exemplo, meu comando 'mv').
A etapa 4 coloca o processo pausado em segundo plano e o reinicia.
A etapa 5 permite que você negue o processo. ** Para obter uma lista de trabalhos, basta digitar jobsantes.


** Em relação à rejeição (do manual do bash):

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.
Caos
fonte
2
Built-in são sempre a minha primeira escolha :) THX
ken_oy
Esta resposta deve ser marcada como correta. Instalar e se acostumar a rastrear para resolver esse problema é exagerado.
Ulrich-Lorenz Schlüter
Isso é muito útil quando você já iniciou qualquer comando e está em execução por muito tempo. Terminar e iniciá-lo em uma sessão do TMUX levará tempo
Deepali Mittal
1
@ tom-brossman: Cuidado com edições desnecessárias como esta ! Se chamado sem especificação de trabalho, o disowncomando interno atua no trabalho em segundo plano mais recente.
precisa
22

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 (os atuais, mas infelizmente não mantidos. Aparentemente sendo desenvolvidos ativamente agora ) e tmux (mais recentes, mantidos ativamente). O Byobu é um front end que pode ser executado em cima desses sistemas e oferecer informações adicionais sobre o 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

O Byobu pode ser instalado no computador em uma máquina baseada no 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 byobuna máquina host após conectar usando o ssh. Isso fornecerá 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:

Inicie o byobu digitando byobu.

Você pode pressionar F2 para criar uma nova janela na 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 do byobu) para segundo plano e retomar na próxima vez que vier:

  • Para sair do byobu e mantê-lo em execução (desconectar), pressione F6.
  • A próxima vez que você vier, apenas faça byobue você estará de volta exatamente onde estava.

    byobu-desanexar-anexar

Você também pode criar várias sessões de byobu byobu -S session1e 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 estão aqui ou aqui .

SiddharthaRT
fonte
Tentei usar o byobu de uma sessão baseada no PuTTY para a minha caixa do Ubuntu, mas recebo a linha de status repetida e rolando no visor. Embora ele tenha sido desconectado corretamente ao pressionar F6, não era uma solução utilizável na minha instalação.
jfmessier
1
@jfmessier É porque o PuTTY não aceita ncurses (utf-8 basicamente) bem. É possível eliminar esse problema seguindo este thread - stackoverflow.com/questions/10731099/…
SiddharthaRT
Isso é incrível! 1. ele me dá um prompt colorido do bash que parece que não consigo ativar o bash como meu shell padrão e 2. Eu consigo executar 2 bots ao mesmo tempo e ainda tenho outro terminal para trabalhar! @SiddharthaRT você merece um voto positivo senhor!
Dev
18

Você não pode fazer isso depois que o processo foi iniciado; é necessário configurar as coisas antes de executar um trabalho de execução demorada.

Você pode usar nohup, mas a sabedoria moderna sugere que você use a tela ou o 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 reconectá-la de outra, o que é útil se você quiser verificar os processos de execução longa que transcendem o final do dia útil.

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

O byobu coloca uma interface fácil de usar na parte superior 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 finalizar os terminais permanentemente.

Richard Holloway
fonte
byobu usa tmux nos dias de hoje ..
scottl 28/11
12
"Você não pode fazer isso depois que o processo foi iniciado; é necessário configurar as coisas antes de executar um trabalho de longa duração". - não, você pode usar disownpara conseguir isso. Veja a resposta de @ bassgey
Rich
1
depois de lutar para aprender tela e tmux .... Byobu trouxe lágrimas aos meus olhos
HDave
disowne, se necessário Ctrl-z, bgobtê-lo no terminal ativo e em segundo plano. Então disown,.
precisa saber é o seguinte
8

Ei, enquanto eu concordava 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 precisar retomar o controle, e o mais importante é que você não sabia que seria necessário fechar a sessão e que o processo já está em execução, você não terá sorte se você usou o bash como a concha

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

Por fim, invoque o comando rejeitado (seguido pelo jobid ... o mesmo que com o comando bg)

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

Jorge Gutierrez
fonte
2
Esta resposta é a melhor! Por que todo mundo está falando screen, a questão foi colocada no 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
1
Simplesmente bg(sem %1) é muitas vezes suficiente, uma vez que o padrão é o trabalho atual
Walter Tross
Seria bom ter uma resposta abrangente: A priori (configurando com antecedência): tela do terminal ascii (antiga), tmux (nova); X windows: vnc (antigo, ainda mantido), xpra (mais recente), com o xpra sem raiz. Um posterior (persistindo depois que você começou): ^ Z, renúncia, ... Mas estou com preguiça de dar mais detalhes do que isso.
Krazy Glew
8

Para um único script de shell em execução por um longo período de tempo, efetuarei login e executarei o processo em segundo plano usando '&'.

Exemplo:

/path/to/my/script &

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


fonte
3
Sim, gostaria de saber como o screen / tmux é melhor do que esta solução simples.
Mads Skjern
Sim, eu posso ver isso no meu ubuntu também, mas isso não deve acontecer em teoria. Eu não entendo o porquê
Daniel Pinyol
1
@MadsSkjern Porque você não pode inserir nenhuma entrada no script usando este método.
Ken afiada
1
@MadsSkjern o motivo é que, se você executar processos como este, &se fizer logoff e logon na sua sessão SSH, o processo ainda estará em execução, mas você não poderá ver a saída desse processo (se o seu script ecoou algo que você não vai vê-lo, mas se ele grava um arquivo o arquivo estará lá)
DarkCygnus
4

Você deve verificar o GNU Screen e ver 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 screenpara a primeira partida, role pelas mensagens de introdução; você deve receber um terminal.
  • Ca Cc abre outro terminal
  • Ca Ck mata um terminal
  • Você pode usar o Ca C-Space e o Ca C-Backspace para percorrer os terminais
  • Ca Ca é útil se você estiver usando principalmente apenas dois terminais
  • O Ca Cd desconecta a sessão de tela atual e sai das telas. Você pode usar screen -rpara retomar essa sessão. Você pode ter várias sessões de tela desanexadas ao mesmo tempo; nesse caso, você verá uma lista de sessões disponíveis.

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

T. Verron
fonte
3

Resposta mais simples ...

ctrl + z suspende o programa em execução

"bg" irá executá-lo em segundo plano

corda
fonte
5
Sem negar o processo (com algo como disownou nohup), isso normalmente não manterá o processo em execução após o final da sessão SSH.
Elias Kagan
3
No meu servidor Ubuntu, com a configuração padrão, ele realmente continua funcionando!
Mads Skjern
3

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

disown -a
Zibri
fonte
0

Enquanto todo mundo diz para usar disown(a única opção que você tem depois de iniciar o processo), nohupou até mesmo executar o comando screen, o que é útil se você quiser ver toda a saída do comando ... sou fã de screen.. Eu ainda tentei as distribuições mainstream mais recentes do Linux e simplesmente colocar o trabalho em segundo plano e sair não causa a morte de todos os processos em execução. Deve haver uma configuração global ou algo assim. 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 essa screenseria a melhor maneira de executar isso, mesmo que meu script tenha sido gravado em arquivos de log ou qualquer outra coisa ... Eu nunca precisei usar disown -a ou a nohupmenos que estivesse completamente sem paranóia. Talvez alguém possa lançar alguma luz sobre como o bash se comporta por padrão? Talvez alguns administradores de sistema alterem os padrões em shells grandes para impedir que os processos de seus usuários sobrecarregem o sistema?

Dan Gullage
fonte
Se você tiver qualquer consulta por favor, pergunte-lo como uma nova pergunta
heemayl
0

Infelizmente, uma sessão SSH finalizada pode resultar em tmux ou tela sendo eliminada. Isso ocorre porque systemdencerrará qualquer processo filho ao sair de uma sessão.

Você pode alterar essa configuração em seu logind.conf( /etc/systemd/logind.conf):

KillUserProcesses=no

Agradecemos a resposta em https://unix.stackexchange.com/questions/490267 .

Jonathan
fonte
-1

Ao invés de :

cmd options; 

Adicione antes nohup:

nohup cmd options & 

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

tail -f nohup.out
Abdennour TOUMI
fonte