我尝试显示文本文件的尾部。如果文件很小,则没有区别。但是,如果文件太大(〜5 gB), tailf 不会响应。另一方面, tail -f 可以正常工作。它们之间有什么区别?

最佳答案

我也遇到过同样的问题。日志文件约为47GB。 tailf几乎等待无限。但是tail -f在几秒钟内开始打印输出。

通过使用strace命令检查基础系统调用,我已经进行了更深入的研究。结果如下:

# strace tailf /var/log/messages

(truncated)
stat("/var/log/messages", {st_mode=S_IFREG|0600, st_size=47432599401, ...}) = 0
open("/var/log/messages", O_RDONLY)     = 3
fstat(3, {st_mode=S_IFREG|0600, st_size=47432600425, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7dba2d1000
read(3, "Nov  1 03:23:01 hostnameXXXX"..., 4096) = 4096
read(3, "0.31.148.12)\nNov  1 03:54:33 del"..., 4096) = 4096
read(3, "io.c(600) [receiver=3.0.6]\nNov  "..., 4096) = 4096
(truncated)

如您所见,tailf尝试从生成的屏幕开始读取(缓冲)所有行。

检查以下tail -f的输出,此处使用系统调用lseek(C/C++)直接跳转到文件末尾并从此处开始读取:
# strace tail -f /var/log/messages

(truncated)
open("/var/log/messages", O_RDONLY)     = 3
fstat(3, {st_mode=S_IFREG|0600, st_size=47294167448, ...}) = 0
lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_END)                   = 47294170917
lseek(3, 47294169088, SEEK_SET)         = 47294169088
(truncated)

关于unix - unix中的tail -f和tailf有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29363377/

10-09 16:31