Como iniciar de forma assíncrona o programa externo de cli e descartar sua saída?

2

Estou escrevendo um simples script de iniciação de desktop que aguarda o disco ocioso e, em seguida, inicia o próximo programa externo (como o Firefox, o Skype ou conky ) usando & , como:

ps cax | grep conky > /dev/null
if [ $? -eq 0 ]; then
  echo "Conky is already running."
else
  wait-for-disk-idle sda
  conky &
fi

Isso é fácil.

O problema é que alguns programas emitem muita saída de depuração para o terminal, que é misturado com as mensagens produzidas pelo meu script de inicialização.

A pergunta: Existe alguma maneira de iniciar de forma assíncrona um programa externo para que sua saída padrão seja descartada?

O que eu já tentei:

  • conky & >/dev/null 2>/dev/null
  • bash -c conky &

A resposta correta:

bash -c "conky >/dev/null 2>/dev/null &"
    
por Adam Ryczkowski 19.01.2014 / 09:15

2 respostas

6

Você provavelmente desejará descartar qualquer saída de STDERR também. Você pode fazer as duas coisas assim:

conky > /dev/null 2>&1 &

Esta instrução essencialmente diz ao shell para fazer o seguinte:

  1. conky > /dev/null - redireciona toda a saída padrão para / dev / null
  2. 2>&1 - Redirecionar erro padrão para onde a saída padrão está apontando atualmente . Por causa do redirecionamento anterior, sua saída padrão está apontando para / dev / null, então o erro padrão será seguido.
  3. & - Executa isso em um subcampo (plano de fundo).
  4. Agradecimentos a @alexis por apontar que minha descrição para & não foi muito precisa:

    (a) Every external command must be run after a (v)fork, not just background processes. (b) Backgrounded processes are not run in a sub-shell, but executed immediately after the fork. The real difference when a process is backgrounded is that the invoking shell doesn't immediately wait(2) for it (but prints a prompt and awaits user input).

  5.   
  Ao redirecionar a saída, o Bash lê os redirecionamentos em ordem, da esquerda para a direita. Bash também trata o '&' como um separador de comandos , que pode ser usado em qualquer lugar ';' normalmente seria usado. O que você estava fazendo era dizer bash
  1. Executar o conky no plano de fundo. Mais especificamente, bifurque o processo e execute-o em um sub-shell, de forma assíncrona, e retorne o controle do terminal para o usuário.
  2. Bash considera isso um novo comando - isto é o mesmo que executar >/dev/null no prompt sem nada anterior ao redirecionamento. Nada acontece.
  3. Redirecione o erro padrão para / dev / null do comando inexistente.
por 19.01.2014 / 09:32
2

Em vez de

conky & >/dev/null 2>/dev/null

Uso:

conky >/dev/null 2>/dev/null &

Explicação: porque '&' serve como um separador de instrução, o primeiro é realmente dois comandos. Funciona assim:

conky &
>/dev/null 2>/dev/null

O primeiro comando executa o conky no segundo plano, mas não redireciona sua saída. O segundo redireciona a saída em um comando inexistente. Para redirecionar a saída do conky, você precisa executar:

conky >/dev/null 2>/dev/null

Para redirecionar a saída do conky e também executar o conky em segundo plano, use:

conky >/dev/null 2>/dev/null &
    
por 19.01.2014 / 09:30