Por que o direcionamento de stdout para um arquivo é inconsistente e atrasado? [duplicado]

0

Eu tentei dois métodos para direcionar a saída das chamadas printf de um programa para um arquivo. Em ambos os casos, às vezes o arquivo é atualizado imediatamente, às vezes leva vários minutos e às vezes não atualiza o arquivo.

Meu programa é executado a partir de um script bash executado por /etc/network/if-up.d/upstart . Eu tentei isso para o meu script bash:

    #!/bin/bash
    sleep 2

    if ! pgrep "demo" > /dev/null
    then
        sudo /home/pi/code/demo_device/demo >> /home/pi/code/demo_device/auto_log.txt 2>&1 &
    fi

e isso:

    #!/bin/bash
    exec 1> >(logger -s -t $(basename $0)) 2>&1
    sleep 2

    if ! pgrep "demo" > /dev/null
    then
        sudo /home/pi/code/demo_device/demo &
    fi

O arquivo auto_log.txt no primeiro caso e o /var/log/user.log arquivo no segundo caso, ambos têm os problemas que descrevi acima. Eu também tive o script bash executar o executável demo com start-stop-daemon e obtive os mesmos resultados. Como posso ter uma atualização de arquivo de log imediatamente e consistentemente ao executar um programa como um processo em segundo plano na inicialização?

nota: não sei se isto é relevante, mas o programa foi concebido para funcionar continuamente e nunca sair.

    
por Jason 11.11.2016 / 19:34

1 resposta

3

com relação ao seu arquivo de saída não sendo atualizado tente modificar o programa em C e coloque uma instrução fflush(stdout); após suas instruções printf() . Isso forçará uma gravação no fluxo de saída. Normalmente, se o printf () tiver \n , ele fará com que a saída seja gravada na tela ou no arquivo, mas nem sempre. Então, quando você definitivamente quer que aconteça, use fflush(); E você não precisa usar fflush () após cada declaração printf, apenas coloque-o no lugar onde ele faz mais sentido, então nesse ponto você quer que todas as declarações printf anteriores que ainda estejam no buffer sejam escritas. fora.

E se o programa C não estiver gravando no stdout, mas em algum outro identificador de arquivo, coloque esse ponteiro de arquivo em fflush (), como no programa de exemplo abaixo

#include <stdio.h>

int main ( int argc, char *argv[] )
{
    FILE *fp;

    fp = fopen( "test.txt", "w" );
    if ( fp != NULL )
    {
       fprintf( fp, "hello world\n");
       fflush( fp );

       /* 
          100+ lines of code here doing something else,
          which could cause the above printf to sit in the
          buffer until fclose or the program ends
       */

       fclose( fp );
    }
    return 0;
}

Se você não pode modificar o programa C escrevendo a saída, então eu não sei como forçar o buffer a liberar de fora do programa.

    
por 11.11.2016 / 20:22