redireciona a saída do shell para o arquivo mesmo quando eu mato o programa

4

Estou depurando um programa que tem uma tendência a travar. Nas ocasiões em que ele é executado corretamente, ./program > log ou ./program | tee log salva uma cópia da saída, mas se eu fizer isso, se o programa travar e eu o matar com ^C (SIGINT), o log estará sempre vazio . Eu sei que o programa escreveu algo para stdout porque isso acontece antes da parte em que qualquer coisa pode ficar presa e, na verdade, quando eu executo apenas ./program , vejo a saída no terminal.

Eu gostaria de uma maneira de tee da saída, de modo que, se eu tivesse que matar o programa, a saída até agora ainda fosse salva em um arquivo de log. Minha concha é bash.

    
por Bristol 03.03.2017 / 15:30

1 resposta

4

Muitos (a maioria?) programas e praticamente todos os programas C ou C ++, 'totalmente' buffer stdout quando é um arquivo de pipe ou disco ou em geral não isattty() e qualquer saída ainda no buffer e não liberado para o sistema operacional quando você mata, ele é perdido. Normalmente, os programas NÃO fazem esse buffer para stderr, e é por isso que isso funciona.

No geral, use stdbuf -oL program ... ou possivelmente -o0 . Alguns programas têm suas próprias opções privadas, por ex. O GNU sed tem -u/--unbuffered .

Como alternativa, use algo que execute o programa em um arquivo e, assim, desative o buffer, incluindo script , screen , expect ou sua forma simplificada unbuffer ou ssh -t .

Para obter mais detalhes e opções, consulte Desativar o buffer no tubo

    
por 03.03.2017 / 17:57