Execute um comando sem me fazer esperar

130

Na CLI, às vezes, um comando digitado demora um pouco para ser concluído e, às vezes, sei quando isso está prestes a acontecer. Estou um pouco confuso sobre "backgrounding" e tal no Linux.

Qual é a maneira mais comum (ou amigável ao usuário) de dizer ao CLI que eu não quero esperar, por favor, me devolva o meu aviso imediatamente. E se pudesse me dar uma barra de progresso ou apenas um spinner ocupado, isso seria ótimo!

    
por themirror 04.12.2013 / 22:23

8 respostas

143

Antes de executar o comando, você pode acrescentar & à linha de comando para executar em segundo plano:

long-running-command &

Depois de iniciar um comando, você pode pressionar Ctrl Z para suspendê-lo e, em seguida, bg para colocá-lo em segundo plano:

long-running-command
[Ctrl+Z]
bg
    
por 04.12.2013 / 22:28
108

Este é o favorito de todos, já que além de enviar o processo para o segundo plano, você não precisa se preocupar com a saída de texto sujando seu terminal:

nohup command &

Isso não apenas executa o processo em segundo plano, também gera um log (chamado nohup.out no diretório atual, se isso não for possível, seu diretório inicial) e se você fechar / logout do shell atual, o processo não é morto por impedindo que o processo filho receba os sinais pai ao ser eliminado (ou seja, efetuando logout, pelo SIGHUP no pai, ou fechando o shell atual).

Existe outro chamado disown , mas é uma extensão de outras respostas, e não um método em si mesmo:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Esses comandos não permitem que você recupere facilmente as saídas do processo, a menos que você use uma maneira rápida de realizá-lo.

    
por 05.12.2013 / 02:19
23

Isso é provavelmente o que você quer

my_command > output.log 2>&1 &

isto iniciará seu comando, redirecionando stdout e stderr para algum output.log que você possa especificar. Se você não quiser armazenar a saída - você pode usar /dev/null em vez de um arquivo real.

& executará o comando em segundo plano para que você possa continuar a inserir comandos enquanto estiver em execução. 2>&1 redireciona stderr para stdout para que toda a saída seja capturada.

também, quando você executa um comando como este, você deve obter uma confirmação do kernel similar a isto: %código% Isso significa que seu processo está sendo executado em segundo plano e seu id é [2] 1234 , então você pode matá-lo mais tarde, se desejar, com 1234

    
por 02.11.2015 / 16:43
7

Procure na tela ou tmux . Um exemplo com tmux :

$ tmux new -d 'longrunningcommand'

Enquanto as outras respostas usam '&' para fundo vai funcionar, você tem que redirecionar stdout (e stderr!). Sem fazer isso, a saída irá diretamente para o seu shell, misturando com qualquer outra saída que você tenha.

O plano de fundo também falhará se você estiver executando um comando longo e desconectar ou desconectar. O sistema irá matar o seu trabalho.

Se você não está familiarizado com a tela ou o tmux, eles basicamente permitem que você se desconecte completamente do seu shell. Em vez de basear o seu programa, você é o fundo de todo o shell. Você pode então voltar para ele depois, mesmo de outro computador. Ambos possuem uma tonelada a mais de recursos que você pode ou não achar útil além deste caso de uso.

A tela é o antigo programa testado e comprovado; O tmux é muito mais novo, mas aprendeu com o passado da tela.

    
por 05.12.2013 / 02:03
5

(Para completar - respondido já :) Você coloca um comando em segundo plano adicionando & após o comando:

long_command with arguments > redirection &

Estou adicionando esta resposta para abordar a outra parte da sua pergunta:

Não há um equivalente real do controle giratório para mostrar os comandos de segundo plano em andamento, mas você pode ver o status dos comandos em segundo plano digitando jobs ou jobs -l . Ele mostrará seus comandos em segundo plano e se eles estão em execução, interrompidos por sinal (por exemplo, com ^Z ) ou ocasionalmente interrompidos porque estão aguardando informações interativas de você.

    
por 05.12.2013 / 00:28
3

Você pode executar um programa em segundo plano usando & . Por exemplo, se você quisesse executar yum install XyZ , por exemplo, poderia executar:

yum install XyZ &

O stdout ou a saída do programa pode ser redirecionado usando > para sobrescrever um arquivo ou >> para anexar a um arquivo. Por exemplo, se você quiser registrar yum em um arquivo yum.log :

yum install XyZ > yum.log &

Ou, se você quiser adicionar a saída a um arquivo existente log :

yum install XyZ >> log &

Erros são impressos em stderr e não stdout , e podem ser redirecionados para um arquivo da mesma maneira, mas usando 2> :

yum install XyZ 2> errors
yum install XyZ 2>> errors

Se você quiser redirecionar os dois stderr e stdout , use &> :

yum install XyZ &> output
yum install XyZ &>> output
    
por 05.12.2013 / 02:29
2

Você pode executar um comando em segundo plano simplesmente colocando & após ele.

Por exemplo:

areallylong_command &

executará em segundo plano.

Você pode redirecionar ainda mais o stdout / stderr para os arquivos apropriados para que eles não apareçam no seu terminal enquanto você estiver fazendo algo.

Veja isso para obter mais informações: link

    
por 04.12.2013 / 22:27
0

Tente usar o comando 'screen' antes de iniciar sua tarefa de longa duração e, quando você desanexar, poderá reconectá-la novamente com 'screen -r -d' sempre que precisar novamente. Eu acho que ao usar um terminal sobre o ssh ou outras conexões de rede, elas podem, às vezes, ser quebradas por uma conexão ruim com o servidor. executá-lo dentro de uma 'tela' corrige esse problema.

    
por 08.08.2017 / 20:44