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!
command-line
background-process
o espelho
fonte
fonte
Respostas:
Antes de executar o comando, você pode anexar
&
à linha de comando para executar em segundo plano:Após iniciar um comando, você pode pressionar CtrlZpara suspendê-lo e
bg
colocá-lo em segundo plano:fonte
find ...
comando primeiro e depois executá-lo em segundo plano. Nesse caso, você estava perdendo a-name
opção.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:
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, 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,
disown
mas isso é uma extensão de outras respostas, e não um método em si:Esses comandos não permitem recuperar facilmente as saídas do processo, a menos que você use uma maneira hackeada para fazê-lo.
fonte
nohup
em um shell de controle de trabalho é bobo. Os shells modernos não são enviadosHUP
para processos em segundo plano. Redirecionar para um nome de arquivo exclusivo é um preço pequeno a pagar.command > file.log 2>&1 & disown
é um pouco mais longo,nohup command &
mas acho que é o que @chicks estava sugerindo.Provavelmente é isso que você quer
my_command > output.log 2>&1 &
isso iniciará seu comando, redirecionando stdout e stderr para alguns
output.log
que você pode especificar. Se você não quiser armazenar a saída, use-o em/dev/null
vez de um arquivo real.&
executará o comando em segundo plano para que você possa continuar inserindo comandos enquanto estiver em execução.2>&1
redireciona 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
fonte
2>&1
é muito importante porque o comando pode falhar e tente gerar o erro em alguns casos!Olhe para a tela ou tmux . Um exemplo com
tmux
: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.
fonte
(Para completar - já respondi :) Você coloca um comando em segundo plano adicionando
&
após o comando: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
jobs
oujobs -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ê.fonte
long_command with arguments &> redirection &
redirecionar ostderr
tambémVocê pode executar um programa em segundo plano usando
&
. Por exemplo, se você quiser executar,yum install XyZ
por exemplo, poderá executar:A
stdout
saída ou do programa pode ser redirecionada usando>
para substituir um arquivo ou>>
anexá-lo. Por exemplo, se você deseja efetuar loginyum
em um arquivoyum.log
:Ou, se você deseja adicionar a saída a um arquivo existente
log
:Os erros são impressos para
stderr
e nãostdout
e podem ser redirecionados para um arquivo da mesma maneira, mas usando2>
:Se você deseja redirecionar ambos
stderr
estdout
, pode usar&>
:fonte
Você pode executar um comando em segundo plano simplesmente colocando
&
sinal após ele.Por exemplo:
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
fonte
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.
fonte