Log-Files

在 Linux 下,如何強制程序刷新寫入打開文件描述符的數據?

  • February 23, 2016

我有一個在嵌入式 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

如果您願意,您還可以檢查文件的名稱並僅為您感興趣的日誌文件更改緩衝。

引用自:https://serverfault.com/questions/464323