Usar o top
comando com redirecionamento funciona bem:
top > top.log
Agora eu quero usar o grep para filtrar uma determinada linha:
top | grep "my_program" > top.log
Mas o arquivo de log permanecerá vazio. Mas o grep fornece uma saída ao usar
top | grep "my_program"
Onde my_program
deve ser substituído por um programa em execução para ver alguma saída.
Por que minha abordagem não funciona? E como posso corrigir isso?
-b
opção detop
ou usarps
.-b
não resolveu meu problema, mas resolveu alguns problemas de codificação. Obrigado.Respostas:
Eu recebo o mesmo comportamento que você descreve. No Ubuntu 11.10
não produz nenhuma saída.
Eu acredito que a razão para isso é que o grep está armazenando sua saída em buffer. Para dizer ao GNU grep para cuspir a saída linha por linha, use a
--line-buffered
opção:Veja também esta questão de SO para outras soluções em potencial.
fonte
--line-buffered
resolve o problema.-b
opção ainda é um bom conselho de Lev Levitsky. Isso resolveu alguns problemas de codificação com o arquivo de log.você deveria usar:
o "-n 1" executa o topo da lista por uma iteração e fecha em vez de atualizar continuamente a cada poucos segundos
já que você está procurando apenas uma linha, o ps seria uma ferramenta melhor para usar.
fonte
Minha solução alternativa para esse problema foi:
Dessa maneira, eu poderia ter um monitor em execução em segundo plano para my_program e manter todos os resultados no arquivo top.log.
fonte
Tente o seguinte:
O que significa
2>&1
?fonte
Embora ambos funcionem para mim, acho que o conselho de Lev Levitsky é o correto. Use o
-b
argumentoHá uma boa chance de que o redirecionamento de saída seja o problema e que você não esteja obtendo nada através do stdout; portanto, tente o seguinte:
Observe que você também pode ter problemas com o buffer de saída. Seu shell não grava constantemente no arquivo para que possa demorar um pouco para
top.log
ser preenchido.fonte