desenv-web-rp.com

Executar um comando sem me fazer esperar

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 amigável) de informar a CLI que não quero esperar, devolva meu prompt imediatamente. E se isso pudesse me dar uma barra de progresso ou apenas um movimento ativo, seria ótimo!

147
themirror

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

long-running-command &

Após iniciar um comando, você pode pressionar CtrlZ suspendê-lo e depois bg para colocá-lo em segundo plano:

long-running-command
[Ctrl+Z]
bg
158
Greg Hewgill

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, como 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á interrompido, impedindo que o processo filho receba os sinais dos pais ao ser morto (por exemplo, logout, pelo SIGHUP ao pai ou fechar o Shell atual).

Há outros chamados disown, mas 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ê usa uma maneira hackeada para fazer isso.

118
Braiam

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 /dev/null em 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, quando você executa um comando como este, 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 com kill -9 1234

35
travnik

Olhe para tela ou tmux . Um exemplo com tmux:

$ tmux new -d 'longrunningcommand'

Enquanto as outras respostas que usam '&' para segundo plano funcionarem, você precisará redirecionar o stdout (e o stderr!). Sem fazer isso, a saída irá diretamente 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 útil 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.

10
yoonix

(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 jobs ou jobs -l. Ele mostrará seus comandos em segundo plano e, se estiverem em execução, parados por sinal (por exemplo, com ^Z) ou ocasionalmente interrompidos porque estão aguardando uma entrada interativa sua.

5
alexis

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

yum install XyZ &

O stdout ou a saída do programa pode ser redirecionada usando > para substituir um arquivo ou >> para anexar a um arquivo. Por exemplo, se você deseja registrar yum em 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 em stderr e não em 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ê deseja redirecionar stderr e stdout, você pode usar &>:

yum install XyZ &> output
yum install XyZ &>> output
4
Davidson Chua

Você pode executar um comando em segundo plano simplesmente colocando & assine depois.

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

2
mkc

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 dentro de uma 'tela' corrige esse problema.

0
meaje