当我为日志文件运行 tail -f 时, logrotate 旋转它但 tail -f 没有停止。它继续在新文件中显示日志。之后我手动尝试;
mv my.log my.log.2
touch my.log
echo "test text" >> my.log
echo "test text" >> my.log
它不起作用。logrotate 如何旋转日志?它是否将所有行复制到新文件?
注意:我正在开发 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 没有改变,因此它很可能使用了 copytruncate 方法。