Bash: melhor maneira de gerar saída para o console e o arquivo de saída do que o tee?

2

O que preciso exibir é uma atualização de log periodicamente. É um bloco de cerca de 10 linhas de texto. Eu estou usando | tee e funciona agora. No entanto, o desempenho é menos satisfatório. Ele aguarda alguns instantes e produz vários blocos de textos de várias atualizações (especialmente quando o programa simplesmente inicia, demora um bom tempo para começar a exibir qualquer coisa no console e a primeira vez que vi isso, achei que o programa estava travando). Além disso, ele quebra aleatoriamente no meio do último bloco, então é muito feio apresentar.

Existe uma maneira de melhorar isso? (Talvez saia menos a cada vez e alterne entre o arquivo de saída e o console com mais frequência?)

Atualizar : aqui está o que está no meu script bash agora: tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log

    
por tmp 13.03.2015 / 02:41

2 respostas

1

Eu acho que o seu problema surge de uma característica fundamental dos tubos, ou seja, buffering.

As soluções alternativas são confusas, mas você deve observar comandos como unbuffer ou script ou stdbuf .

Talvez algo para parar o buffer de saída por tee assim:

 your_program | stdbuf -o0 tee

PS. Eu não estou em um console agora, então não posso tentar isso.

    
por 13.03.2015 / 08:49
0

Eu uso um agrupamento de comandos e redireciono a saída para uma substituição de processo. No interior, faço eco a / dev / tty e stdout. Então eu redireciono stdout e stderr para um arquivo. Funciona para mim até agora. Você pode facilmente preceder a saída com timestamp e um identificador de processo, se desejar.

{
  #script goes here
} > >(while read TEXT ; do MESSAGE="$(date +"%d.%m.%Y") $(date +"%Hh%Mm%Ss") $LOGPREFIX $TEXT"; echo $MESSAGE; echo $MESSAGE > /dev/tty; done >> $LOGFILE) 2>&1 
    
por 15.10.2017 / 17:40