Como se certificar de que um comando não seja interrompido, mesmo se o terminal estiver fechado? [duplicado]

19

No Linux. Digamos que eu queira executar um comando e demore muito. Eu só quero garantir que esteja pronto. Como?

    
por user4951 12.01.2014 / 13:16

9 respostas

30

nohup

leia a man page para nohup usage.

nohup é o modo como é feito há muito tempo, desde antes que screen , tmux , etc fossem inventados.

Exemplo:

nohup my_long_running_proc &

Executa "my_long_running_proc" e qualquer mensagem de console (stdout / stderr) entra em um arquivo chamado "nohup.out" no diretório a partir do qual o comando foi iniciado.

    
por 12.01.2014 / 14:28
8

Use tmux ou screen para fornecer um ambiente de sessão persistente para o comando ser executado.

Usando tmux , isso pode ser feito da seguinte maneira:

  • Iniciar um novo ambiente de sessão: tmux new -s my-session-name
  • Execute seu comando: longrunningcommand
  • Feche sua janela de terminal, sessão SSH ou desanexe manualmente de tmux usando Ctrl+b e, em seguida, d
  • Reconecte-se à sua sessão usando: tmux attach-session -t my-session-name

tmux pode fazer muito mais além disso, mas uma coisa básica que provavelmente deve ser adicionada: use tmux list-sessions para ver todas as sessões ativas.

    
por 12.01.2014 / 13:26
8

Teste-o com o comando xclock. Abra um console, digite

xclock

Feche o console. xclock desaparece. Agora digite

xclock &

O xclock ainda desaparece porque ainda é um sub-processo do seu shell. Agora digite

xclock & disown

Agora o xclock não é mais um subprocesso do seu shell e você pode fechar o console e o xclock continuará funcionando.

Eu documentei isso aqui: link

    
por 12.01.2014 / 14:46
4
  1. Use a tela (tela do homem)
  2. acrescentar "&" no final do comando. Ele será lançado em segundo plano e se você matar a sessão do terminal, acho que deve ser concluído. De qualquer forma eu recomendo sempre usar tela.
por 12.01.2014 / 13:25
4

Quando você efetua logout do seu shell, qualquer elemento ainda em execução recebe um sinal SIGHUP. Para que seu processo continue a ser executado após o logout, ele precisa capturar, ignorar ou evitar esse sinal, já que o comportamento padrão é sair.

O comando nohup irá ignorar o sinal e é uma maneira comum de fazê-lo se o processo não enviar nada importante para stdout .

O comando screen (que é minha preferência) cria um shell dentro de um shell que pode ser desanexado e reconectado, evitando assim que o sinal seja gerado (ou melhor, ele é removido do pai nunca recebe o sinal).

Se o processo for escrito por você, você pode codificá-lo para capturar o sinal e, em seguida, realizar qualquer ação, inclusive ignorá-lo, para que ele continue a ser executado após o logout. Seu processo também pode se desassociar completamente de seu processo pai (consulte setsid() ) para que, como em screen , ele não receba o SIGHUP durante o logout.

Qual método você escolhe e é mais adequado à sua situação e uso.

    
por 12.01.2014 / 21:52
3

Com o bash 3.2, descobri que disown -h funciona melhor. Por exemplo, para impedir que gedit feche quando o terminal fechar, preciso ambos colocá-lo em segundo plano e usar disown . É fácil fazer isso através de uma função em ~ / .bashrc:

ge() { gedit "$@" & disown -h; }  # need double--not single--quotes
    
por 12.01.2014 / 18:43
0

use o tmux:

sudo apt-get install tmux

Para iniciá-lo simplesmente digite tmux e para minimizá-lo pressione Ctrl + b e então d para iniciar o mesmo tipo de sessão% código%.

    
por 12.01.2014 / 20:48
0

Redirecione o stdout e stderr do comando para um arquivo, salve seu valor de saída e execute-o em nohup ou (melhor) em um multiplexador de terminal como tmux ou screen :

command 1> command.out 2> command.err; echo $? > command.exit

Para verificar o progresso, você pode simplesmente tail -f dos arquivos de log. O ponto de fazer login em arquivos é que os multiplexadores de terminal têm buffers limitados (embora normalmente é possível defini-lo como grande o suficiente para a maioria das tarefas) e eles podem falhar, caso em que toda a saída seria perdida .

    
por 12.01.2014 / 21:58
0

Uma ferramenta muito pequena, mas eficiente, que substitui tmux e screen well é dtach , elimina todas essas funções complicadas de gerenciamento do Windows, mas serve apenas para preservar o trabalho nas costas e trazê-lo em primeiro plano a qualquer momento você gosta.

    
por 13.01.2014 / 06:01