Log-Files
在 Linux 下,如何強制程序刷新寫入打開文件描述符的數據?
我有一個在嵌入式 Linux 系統上執行的二進制程序(沒有可用的資源)。該程序會打開一個日誌文件 (/tmp/dmaosd.log),在其中記錄它正在執行的操作。
問題是日誌以塊的形式更新(一次大約 1000 個字節),所以我無法使用 tail -f 實時查看日誌。
我想知道是否有任何方法可以強制正在執行的程序刷新其數據(基於訪問 /proc/1234/fd/3)而無需訪問其源且不向其發送任何信號(我不確定是什麼信號它支持也不支持他們應該做什麼)。
有問題的過程是媒體播放器的 OSD,日誌資訊通常顯示在螢幕上選擇/顯示了哪些元素,因此盡快獲得數據會很好。
謝謝!
這實際上取決於緩衝區的位置:如果應用程序使用自己的日誌記錄緩衝區,則無法強制刷新。
如果緩衝是由 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
如果您願意,您還可以檢查文件的名稱並僅為您感興趣的日誌文件更改緩衝。