“ tail”命令的“ -f”参数如何工作?


59
$ tail -f testfile

该命令应该实时显示指定文件中的最新条目,对吗?但这没有发生。如果我的意图是错误的,请纠正我。

我创建了一个新文件“ aaa”,并添加了一行文本并将其关闭。然后发出此命令(第一行):

$ tail -f aaa
xxx
xxa
axx

最后三行是文件aaa的内容。现在命令仍在运行(自从使用以来-f),我通过GUI打开了文件aaa,并开始手动添加了几行。但是终端不会显示文件中添加的新行。

怎么了 该tail -f命令仅在新条目仅由系统编写时显示吗?(如日志文件等)

Answers:


62

tail(1) 手册页

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

您的文本编辑器正在重命名或删除原始文件,并将新文件保存在相同的文件名下。使用-F代替。


工作了!因此,我可以一直使用$ tail -F filename命令而不是$ tail -f filename对吗?
its_me 2011年

17
如果那是您的预期行为。在某些情况下,您可能要使用描述符而不是文件名,但是为了公平起见,我并没有遇到很多。
伊格纳西奥·巴斯克斯

lsof可以显示这种情况-例如,lsof -Fpcftni将显示后面跟随的inode tail不再与编辑器打开的inode 相同。
亚伦·马拉斯科

10

您的编辑器有自己的文件缓冲区。在编辑器中修改文本时,不会将任何内容写入文件本身。

保存更改时,编辑器很可能会删除旧文件并创建一个新文件。tail -f仍会连接到已删除的文件,因此不会显示任何新内容。


1
编辑器将覆盖文件,日志将附加文本。这可能是问题所在。
Rufo El Magufo 2011年

@胡安:我不明白你的评论。除了我在答案中描述的含义外,“覆盖”没有具体含义。
斯特凡·吉梅内斯

是的,我的意思与您相同:)
Rufo El Magufo 2011年

3

tail 默认情况下(不是实时)每1秒“刷新”一次。

尝试一下(您需要bash4):

  • 打开2个端子。
  • 在第一个终端中执行touch ~/output.txttail -f ~/output.txt
  • 在第二个终端执行 for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • 查看第一个终端中tail的输出。

你是说echo $i >> ~/output.txt吗 另外,这个答案也遗漏了问题的重点。
伊格纳西奥·巴斯克斯

1
是的,我在您发表评论时纠正了失败:)。我的答案仅是对问题
Rufo El Magufo 2011年

4
@Juan:如今,在Linux上,tailf有一个基于inotify的实现。因此它将实时刷新。
斯蒂芬·吉梅内斯

tailf,但tail使用inotify ?。我不知道tailf。tail的联机帮助页显示的默认值为1秒-s
Rufo El Magufo 2011年

3
是的,tail紧随其后,并且在可用时也正在使用inotify。tailf文件上没有任何活动时,根本不轮询,而只是休眠。tail -f显示一些活动(请参阅strace输出)。
斯蒂芬·吉梅内斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.