У меня есть бинарный процесс (без доступных источников), работающий во встроенной системе Linux. Процесс открывает файл журнала (/tmp/dmaosd.log), в котором записывается, что он делает.
Проблема в том, что журнал обновляется кусками (около 1000 байт за раз), поэтому я не могу смотреть журнал в реальном времени с помощью tail -f.
Интересно, есть ли способ заставить запущенный процесс сбрасывать свои данные (на основе доступа к / proc / 1234 / fd / 3) без доступа к его источникам и без отправки ему сигналов (я не уверен, какие сигналы он не поддерживает ни то, что они должны делать).
Рассматриваемый процесс - это экранное меню для медиаплеера, и информация журнала обычно показывает, какие элементы выбраны / показаны на экране, поэтому было бы неплохо получить данные как можно быстрее.
Спасибо!
Это действительно зависит от того, где находится буфер: если приложение использует свой собственный буфер журналирования, то нет способа принудительно сбросить его.
Если буферизация выполняется библиотекой C, вы можете использовать LD_PRELOAD для отключения буферизации. Предполагая, что программа использует fopen()
чтобы открыть его файл журнала, вы можете сделать что-то вроде этого:
#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;
}
Скомпилируйте как разделяемую библиотеку, а затем используйте LD_PRELOAD для «внедрения» в программу:
LD_PRELOAD=./nobuffering.so myprogram
При желании вы также можете проверить имя файла и изменить буферизацию только для интересующего вас файла журнала.