Назад | Перейти на главную страницу

Как заставить процесс сбрасывать данные, записанные в дескриптор открытого файла под Linux?

У меня есть бинарный процесс (без доступных источников), работающий во встроенной системе 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

При желании вы также можете проверить имя файла и изменить буферизацию только для интересующего вас файла журнала.