Executar um comando sem me fazer esperar

145

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

Qual é a maneira mais comum (ou fácil de usar) de dizer à CLI que não quero esperar, devolva minha solicitação imediatamente. E se isso pudesse me dar uma barra de progresso ou apenas um movimento ativo, isso seria ótimo!

o espelho
fonte
3
Consulte também Como você envia aplicativos de linha de comando diretamente para o plano de fundo? se você já iniciou o comando e deseja enviá-lo para segundo plano.
Gilles

Respostas:

153

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

long-running-command &

Após iniciar um comando, você pode pressionar CtrlZpara suspendê-lo e bgcolocá-lo em segundo plano:

long-running-command
[Ctrl+Z]
bg
Greg Hewgill
fonte
Eu usei o comando "find ~ / a.java &", mas não entrei em segundo plano? Além disso, eu tentei cmd + z (para Mac) .... ele não está funcionando
Abhimanyu Aryan
11
@AbhimanyuAryan, talvez você queira depurar seu find ...comando primeiro e depois executá-lo em segundo plano. Nesse caso, você estava perdendo a -nameopção.
Alexis Wilke
113

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

nohup command &

Isso não apenas executa o processo em segundo plano, também gera um log (chamado nohup.outno diretório atual, se isso não for possível, no diretório inicial) e se você fechar / sair do shell atual, o processo não será eliminado, impedindo que o processo filho receba o pai sinaliza quando morto (ou seja, desconectando, pelo SIGHUP do pai, ou fechando o shell atual).

Há outras chamadas, disownmas isso é uma extensão de outras respostas, e não um método em si:

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 recuperar facilmente as saídas do processo, a menos que você use uma maneira hackeada para fazê-lo.

Braiam
fonte
4
Sysadmin desde '95. Nunca ouvi falar em repúdio até hoje, obrigado! No entanto, ele não funciona com todos os shell (o bash verificado, zsh, tcsh. Tcsh não funcionou).
Yoonix
O uso nohupem um shell de controle de trabalho é bobo. Os shells modernos não são enviados HUPpara processos em segundo plano. Redirecionar para um nome de arquivo exclusivo é um preço pequeno a pagar.
pintos
@chicks, o caso de uso aqui é para impedir que o stderr e o stdout poluam o terminal com a vantagem de criar um arquivo de log automaticamente.
Braiam 4/11/15
11
command > file.log 2>&1 & disowné um pouco mais longo, nohup command &mas acho que é o que @chicks estava sugerindo.
Joeytwiddle
31

Provavelmente é isso que você quer

my_command > output.log 2>&1 &

isso iniciará seu comando, redirecionando stdout e stderr para alguns output.logque você pode especificar. Se você não quiser armazenar a saída, use-o em /dev/nullvez de um arquivo real.

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

Além disso, ao executar um comando como este, você deve obter uma confirmação do kernel semelhante a esta: [2] 1234 Isso significa que seu processo está sendo executado em segundo plano e seu ID é 1234, para que você possa matá-lo mais tarde, se desejar comkill -9 1234

travnik
fonte
2
obrigado, 2>&1é muito importante porque o comando pode falhar e tente gerar o erro em alguns casos!
ericn
11
Este funcionou quando as respostas acima não agradeceram.
Domagoj
9

Olhe para a tela ou tmux . Um exemplo com tmux:

$ tmux new -d 'longrunningcommand'

Enquanto as outras respostas que usam '&' em segundo plano funcionarem, você deverá redirecionar o stdout (e o stderr!). Sem fazer isso, a saída irá direto para o seu shell, misturando-se com qualquer outra saída que você possa ter.

O background também falhará se você estiver executando um comando longo e fizer logout ou for desconectado. O sistema matará seu trabalho.

Se você não conhece a tela ou o tmux, eles basicamente permitem que você se desconecte completamente do seu shell. Em vez de colocar em segundo plano o seu programa, você coloca em segundo plano todo o shell. Você pode voltar a usá-lo mais tarde, mesmo em outro computador. Ambos têm muito mais recursos que você pode ou não achar úteis além deste caso de uso.

Tela é o antigo programa testado e verdadeiro; O tmux é muito mais jovem, mas aprendeu com o passado da tela.

yoonix
fonte
Esta resposta perde uma resposta real e soa como um RTFM.
Lloeki
5

(Para completar - já respondi :) 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 existe um equivalente real do botão giratório para mostrar comandos em segundo plano em andamento, mas você pode ver o status dos comandos em segundo plano digitando jobsou jobs -l. Ele mostrará seus comandos em segundo plano e se eles estão sendo executados, parados por sinal (por exemplo, com ^Z) ou ocasionalmente parados porque estão aguardando uma entrada interativa de você.

alexis
fonte
long_command with arguments &> redirection &redirecionar o stderrtambém
Ice-Blaze
3

Você pode executar um programa em segundo plano usando &. Por exemplo, se você quiser executar, yum install XyZpor exemplo, poderá executar:

yum install XyZ &

A stdoutsaída ou do programa pode ser redirecionada usando >para substituir um arquivo ou >>anexá-lo. Por exemplo, se você deseja efetuar login yumem um arquivo yum.log:

yum install XyZ > yum.log &

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

yum install XyZ >> log &

Os erros são impressos para stderre não stdoute podem ser redirecionados para um arquivo da mesma maneira, mas usando 2>:

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

Se você deseja redirecionar ambos stderre stdout, pode usar &>:

yum install XyZ &> output
yum install XyZ &>> output
Davidson Chua
fonte
2

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

Por exemplo:

areallylong_command &

irá executá-lo 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 mais informações: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

mkc
fonte
0

Tente usar o comando 'screen' antes de iniciar sua tarefa de longa execução e, ao desanexar, você poderá recolocar novamente em 'screen -r -d' sempre que precisar. Acho que, ao usar um terminal por ssh ou outras conexões de rede, às vezes eles podem ser interrompidos por uma conexão ruim com o servidor. executá-lo em uma 'tela' corrige esse problema.

meaje
fonte