我尝试显示文本文件的尾部。如果文件很小,则没有区别。但是,如果文件太大(〜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/