script

script

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 unbufferou scriptou 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 scriptvocê pode gravar toda a sessão do bash, que começa script result.log e termina com exito comando.

Esta resposta já foi incluída por @curious_cat e é a mesma resposta a esta pergunta:Gravando uma sessão bash

informação relacionada