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?
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.
@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.
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.
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.
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.
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:
ssh [servidor]
comando
Ctrl+Z
bg
rejeitado [processo pid opcional, o padrão é o último]
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.
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:
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.
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 .
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.
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.
"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.
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.
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.
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:
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?
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):
Respostas:
Você deve procurar alternativas modernas como
tmux
.tmux
é superior a,screen
por muitas razões, aqui estão apenas alguns exemplos:Funcionalidade básica
Para obter a mesma funcionalidade, conforme explicado na resposta que recomenda
screen
, você deve fazer o seguinte:tmux
digitandotmux
no shelltmux
sessão iniciadatmux
sessão digitando Ctrl+ be depoisdAgora 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 usartmux attach
para anexar à suatmux
sessã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 usandotmux list-sessions
, agora atribuem a uma sessão de corrida com o comandotmux attach-session -t 0
.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 noman tmux
ou na página GitHub tmux . Em particular, aqui está uma FAQ sobre as principais diferenças entrescreen
etmux
.fonte
screen -x -r [screenname]
ou abreviescreen -rx
se você tiver apenas uma sessão de tela ativa. Isso permite anexar uma instância de tela existente.Ctrl-b
e depoisd
sair / desanexar atmux
sessão. Certamente esse é o caso da versão dotmux
meu Ubuntu 12.04.tmux detach
vez de digitar #ctrl-b d
Opção 1:
nohup
A melhor maneira é geralmente a mais simples.
Foi feito especificamente para isso, e até registra stdout
nohup.log
.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
colocar sua tarefa suspensa mais recente em segundo plano, permitindo que ela continue em execução.
Em seguida, um processo 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 recomendonohup
para tarefas que você sabe que vai deixar para trás ebg
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 poderão ser diferentes.
fonte
disown -h
bg
+disown
nã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+z
parou o processo, retornando-me para o bash.bg
retomou 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, umdisown
comando produziu "disown: current: no job"julia myFile.jl
por qualquer motivo. O tmux faz e é ótimo.Você poderia fazer isso usando
screen
.Digite
man screen
para descobrir mais ou leia esta página de manual da tela .Cenário simples:
ssh em sua caixa remota. Digite
screen
Em 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 -r
Isso "retomará" sua sessão de tela e você poderá ver a saída do seu processo.fonte
screen -S name
para facilitar a conexão com a correta mais tarde.screen -S
antes de sair escreen -r
quando voltar é incrível!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.
Com a renúncia, você pode fechar o terminal e executar o processo na máquina.
fonte
disown -a && exit
disown
e o interrompeu .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:
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
jobs
antes.** Em relação à rejeição (do manual do bash):
fonte
disown
comando interno atua no trabalho em segundo plano mais recente.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:
Usando yum, você faz
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 conectar usando o ssh. Isso fornecerá um shell parecido com este: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:
A próxima vez que você vier, apenas faça
byobu
e você estará de volta exatamente onde estava.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 estão aqui ou aqui .
fonte
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.
fonte
disown
para conseguir isso. Veja a resposta de @ bassgeydisown
e, se necessárioCtrl-z
,bg
obtê-lo no terminal ativo e em segundo plano. Entãodisown
,.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.
fonte
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! :)bg
(sem%1
) é muitas vezes suficiente, uma vez que o padrão é o trabalho atualPara 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:
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
&
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á)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 :
screen
para a primeira partida, role pelas mensagens de introdução; você deve receber um terminal.screen -r
para 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.
fonte
Resposta mais simples ...
ctrl + z suspende o programa em execução
"bg" irá executá-lo em segundo plano
fonte
disown
ounohup
), isso normalmente não manterá o processo em execução após o final da sessão SSH.A maneira mais fácil é executar seu comando em segundo plano com
&
. Em seguida, basta escrever:fonte
Enquanto todo mundo diz para usar
disown
(a única opção que você tem depois de iniciar o processo),nohup
ou até mesmo executar o comandoscreen
, o que é útil se você quiser ver toda a saída do comando ... sou fã descreen
.. 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:Embora eu concorde que essa
screen
seria a melhor maneira de executar isso, mesmo que meu script tenha sido gravado em arquivos de log ou qualquer outra coisa ... Eu nunca precisei usardisown -a
ou anohup
menos 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?fonte
Infelizmente, uma sessão SSH finalizada pode resultar em tmux ou tela sendo eliminada. Isso ocorre porque
systemd
encerrará qualquer processo filho ao sair de uma sessão.Você pode alterar essa configuração em seu
logind.conf
(/etc/systemd/logind.conf
):Agradecemos a resposta em https://unix.stackexchange.com/questions/490267 .
fonte
Ao invés de :
Adicione antes
nohup
:Em seguida, você poderá ver o console stdout:
fonte