Depende realmente de onde está o buffer: se o aplicativo usa seu próprio buffer de registro, não há como forçar um flush.
Se o armazenamento em buffer é feito pela biblioteca C, você pode usar LD_PRELOAD para desativar o armazenamento em buffer. Supondo que o programa esteja usando fopen()
para abrir seu arquivo de log, você pode fazer algo assim:
#define _GNU_SOURCE 1
#include <dlfcn.h>
#include <stdio.h>
static FILE* (*libc_fopen)(char const *, char const *);
FILE * fopen(char const *name, char const *mode) {
FILE *ret;
if (!libc_fopen)
libc_fopen = dlsym(RTLD_NEXT, "fopen");
ret = libc_fopen(name, mode);
if (!ret)
return ret;
setvbuf(ret, NULL, _IONBF, 0);
return ret;
}
Compile como uma biblioteca compartilhada e use LD_PRELOAD para "injetar" no programa:
LD_PRELOAD=./nobuffering.so myprogram
Se desejar, você também pode verificar o nome do arquivo e alterar o buffer apenas para o arquivo de registro em que está interessado.