O que preciso exibir é um log atualizado periodicamente. É um bloco de cerca de 10 linhas de texto. Estou usando |tee e funciona agora. No entanto, o desempenho é menos satisfatório. Ele espera um pouco e então gera vários blocos de texto a partir de múltiplas atualizações (especialmente quando o programa apenas inicia, demora um pouco para começar a exibir qualquer coisa no console e a primeira vez que vi isso, pensei que o programa estava travando). Além disso, ele quebra aleatoriamente no meio do último bloco, por isso é bem feio de apresentar.
Existe um jeito de melhorar isto? (Talvez produza 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
Responder1
Acho que o seu problema surge de uma característica fundamental dos pipes, ou seja, o buffer.
As soluções alternativas são confusas, mas você deve observar comandos como unbuffer
ou script
ou stdbuf
.
Talvez algo para interromper o buffer de saída por tee assim:
your_program | stdbuf -o0 tee
PS. Não estou em um console agora, então não posso tentar isso.
Responder2
Eu uso um agrupamento de comandos e redireciono a saída para uma substituição de processo. Dentro, eu faço eco para /dev/tty e para stdout. Então redireciono stdout e stderr para um arquivo. Funciona para mim até agora. Você pode facilmente preceder a saída com carimbo de data/hora 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
Responder3
script
Correr
$ script -c "your_program" result.log
em vez de
$ your_program | tee result.log
por exemplo script -c "ls" result.log
.
BTW: Com script
você pode gravar toda a sessão do bash, que começa
script result.log
e termina com
exit
o comando.
Esta resposta já foi incluída por @curious_cat e é a mesma resposta a esta pergunta:Gravando uma sessão bash