Eu tenho um processo em lote de longa execução que gera algumas informações de depuração e processo para o stdout. Se eu apenas correr de um terminal, posso rastrear 'onde está', mas os dados ficam demais e rolam para fora da tela.
Se eu redirecionar para a saída para um arquivo '> out.txt', obtenho a saída inteira eventualmente, mas ela é armazenada em buffer, para que eu não possa mais ver o que está fazendo no momento.
Existe uma maneira de redirecionar a saída, mas fazer com que ela não armazene em buffer suas gravações?
Respostas:
Você pode definir explicitamente as opções de buffer dos fluxos padrão usando uma
setvbuf
chamada em C (consulte este link ), mas se estiver tentando modificar o comportamento de uma tentativa de programa existentestdbuf
(parte dacoreutils
partida da versão 7.5 aparentemente).Isso armazena
stdout
em buffer até uma linha:Isso desativa
stdout
completamente o buffer:fonte
./configure && make
tarifa padrão . Você nem precisa instalá-lo depois, basta usar ostdbuf
binário desativadosrc/
.Você pode obter saída com buffer de linha para um arquivo usando o
script
comando da seguinte maneira:fonte
batch_process
se você anexa&
ao comando acima, pelo menos na minha caixa Linux), o que parece como um caso de uso extremamente comum eb) não há explicação aqui sobre como esse encantamento funciona.No Ubuntu, o pacote do
unbuffer
programa (oexpect-dev
) fez o truque para mim. Apenas corra:unbuffer your_command
e não vai amortecê-lo.
fonte
A solução mais fácil que encontrei (não precisava de pacotes de terceiros instalados) foi mencionada em um tópico semelhante no site do Unix e Linux : use o
script
comando É antigo e provavelmente já está instalado.Observe que o primeiro parâmetro de nome de arquivo para o
script
comando é o arquivo de log a ser gravado . Se você simplesmente executarscript -q your_command
, substituirá o comando que recuou para executar com o arquivo de log. Verifiqueman script
, para estar seguro, antes de tentar.fonte
tente o
script
comando; se o seu sistema possui, ele recebe um nome de arquivo como argumento, todo o texto despejado no stdout é copiado para o arquivo. É muito útil quando um programa de instalação requer interação.fonte
Pessoalmente, prefiro canalizar a saída de um comando que quero examinar
tee
.script
registra muitas informações, incluindo o tempo das teclas pressionadas e muitos caracteres não imprimíveis. O quetee
economiza é muito mais legível para mim.fonte
tee
é afetado pelo buffer. Frequentemente, ainda recebo linhas parciais exibidas por tee ao dividir a saída dosfind
comandos.Redirecione a saída para um arquivo e siga o arquivo com o
tail -f
comandoEditar
Se isso ainda sofrer buffer, use o recurso syslog (que geralmente é sem buffer). Se o processo em lote for executado como um script de shell, você poderá usar o comando logger para fazer isso. Se o trabalho em lotes for executado em uma linguagem de script, deve haver um recurso de registro de qualquer maneira.
fonte
This answer is useful
respostas que não funcionam e que não podem funcionar?Você pode usar o
tee
comando, apenas mágica!someCommand | tee logFile.log
será tanto visor no console e escrever no arquivo de log.fonte
tee
não impedirá a realização de buffer.tee
não evitará alguns buffers, mas apenas permitirá que você dê uma olhada no que é a saída. Era isso que @JamesDean queria (como eu subestime sua pergunta), mas acho que o buffer não é realmente o problema aqui. Se você tiver mais detalhes, me avise.tee
para obter uma melhor visualização da saída que não está recebendo?>
, não vê nada no console. Eu acho que @ JamesDean está usando a palavra "buffering" para descrever isso. Vou postar um comentário em sua pergunta para ele dizer mais sobre o que ele quer.