Tail “怎么做?”;尾部-f“;工作呢?

Tail “怎么做?”;尾部-f“;工作呢?,tail,logrotate,Tail,Logrotate,当我为日志文件运行tail-f时,logrotate会旋转它,但tail-f并没有停止。它将继续在新文件中显示日志。然后我手动尝试 mv my.log my.log.2 touch my.log echo "test text" >> my.log echo "test text" >> my.log 它不起作用。日志如何旋转日志?它是否将所有行复制到新文件 注意:我正在使用centos 5。即使文件被删除、重命名等,您也可能希望后面跟着tail-F(大写-F) t

当我为日志文件运行tail-f时,logrotate会旋转它,但tail-f并没有停止。它将继续在新文件中显示日志。然后我手动尝试

mv my.log my.log.2
touch my.log
echo "test text" >> my.log
echo "test text" >> my.log
它不起作用。日志如何旋转日志?它是否将所有行复制到新文件


注意:我正在使用centos 5。

即使文件被删除、重命名等,您也可能希望后面跟着tail-F(大写-F)

  tail -F my.log
tail-f(小写)只使用文件描述符,它不关心文件名是什么。tail-F使用文件名,因此如果删除或重命名原始文件并放置新文件,它将拾取新文件

至于logrotate,它有几种不同的工作方式。默认情况下,它会移动(重命名)原始文件,并创建一个新的空文件。在这种情况下,将为日志进程维护文件描述符,直到它关闭并重新打开,然后它将获得新文件

如果使用logrotate“copytruncate”选项,则会同时维护文件和文件描述符,并且logrotate会将所有数据复制到新文件,截断原始文件并保留原始文件。某些进程不关闭其日志文件,因此有必要使用copytruncate。如果没有它,进程将继续以新名称登录到该文件


这种行为是经过设计的,在UNIX中,打开文件的文件描述符不受重命名或删除操作的影响。

要知道这个问题的答案,您需要知道logrotate对该文件做了什么。从尾部手册页

使用--follow(-f),tail默认跟随文件描述符,这意味着即使重命名了tail文件,tail也将继续跟踪其结尾。如果确实要跟踪文件的实际名称,而不是文件名,则不需要此默认行为 描述符(例如,日志旋转)。在这种情况下使用--follow=name。这会使tail以一种适合的方式跟踪命名文件 重命名、删除和创建


您看到的情况表明,当logrotate作用于文件时,fd没有改变,因此它可能使用copyruncate方法。

我认为他的问题是,当
logrotate
移动文件时,他为什么不需要这样做。他使用了
-f
并继续使用新文件。明白了,我不清楚他所说的“新文件”是什么意思。谢谢@mrjoltcola。你是对的。conf文件中有copyruncate选项。为什么不阅读
logrotate
的源代码来查看它的工作原理?检查
logrotate
配置文件,可能它正在测试的文件上使用
copyruncate
选项。