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?
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?
Respostas:
Você deve procurar alternativas modernas como tmux
.
tmux
é superior a, screen
por muitas razões, aqui estão apenas alguns exemplos:
Para obter a mesma funcionalidade, conforme explicado na resposta que recomenda screen
, você deve fazer o seguinte:
tmux
digitando tmux
no shelltmux
sessão iniciadatmux
sessã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 attach
para anexar à sua tmux
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 usando tmux list-sessions
, agora atribuem a uma sessão de corrida com o comando tmux 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 no man tmux
ou na página GitHub tmux . Em particular, aqui está uma FAQ sobre as principais diferenças entre screen
e tmux
.
screen -x -r [screenname]
ou abrevie screen -rx
se você tiver apenas uma sessão de tela ativa. Isso permite anexar uma instância de tela existente.
Ctrl-b
e depois d
sair / desanexar a tmux
sessão. Certamente esse é o caso da versão do tmux
meu Ubuntu 12.04.
tmux detach
vez de digitar #ctrl-b d
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
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 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 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.
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, um disown
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.
screen -S name
para facilitar a conexão com a correta mais tarde.
screen -S
antes de sair e screen -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.
disown [-ar] [-h] [
jobspec
… |
pid
… ]
Sem opções, remova cada especificação de trabalho da tabela de tarefas ativas. Se a
-h
opçã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-a
nem a-r
opção for fornecida, o job atual será usado. Se nenhuma especificação de trabalho for fornecida, a-a
opção significa remover ou marcar todas as tarefas; a-r
opçã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.
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):
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 (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.
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.
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.
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 .
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.
disown
para conseguir isso. Veja a resposta de @ bassgey
disown
e, se necessário Ctrl-z
, bg
obtê-lo no terminal ativo e em segundo plano. Então disown
,.
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.
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 atual
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.
&
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.
Resposta mais simples ...
ctrl + z suspende o programa em execução
"bg" irá executá-lo em segundo plano
disown
ou nohup
), isso normalmente não manterá o processo em execução após o final da sessão SSH.
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 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 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 usar disown -a
ou a nohup
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?
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
):
KillUserProcesses=no
Agradecemos a resposta em https://unix.stackexchange.com/questions/490267 .
Ao invés de :
cmd options;
Adicione antes nohup
:
nohup cmd options &
Em seguida, você poderá ver o console stdout:
tail -f nohup.out