tail -F 有时仍会在 logrotate 上停止

tail -F 有时仍会在 logrotate 上停止
Linux ip-10-10-64-122 4.1.7-15.23.amzn1.x86_64 #1 SMP Mon Sep 14
23:20:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

我使用了tail -F一个 bash 脚本,该脚本依次循环遍历结果。该脚本应该无限期运行

tail -F /tmp/my.log |
grep --line-buffered "xyz" |
while read i
do
    echo "$i"
done
echo "end of read"

然而,虽然有时它可以通过 logrotate 工作,但其他时候却不能:

tail: '/tmp/my.log' has become inaccessible: No such file or directory

在这种情况下,我没有看到“读取结束”,这意味着 tail/while 仍在运行/卡住。我可以确认日志文件确实在 logrotate 之后几毫秒内放回原位,正如您所期望的那样。

Logrotate配置:

/tmp/mosquitto.log {
            rotate 500
            compress
            maxsize 40M
            nocreate
            missingok
            postrotate
                    /usr/bin/killall -HUP mosquitto
            endscript
    }

我怎样才能强制它继续尾随?

答案1

正如我所怀疑的,您的日志轮换基本上是重命名当前日志文件,然后创建一个新文件。您需要使用copytruncatelogrotate 选项,该选项会保留原始日志文件及其所有属性。这将允许tail正确跟踪它。 tail无法跟踪不再存在的文件(copytruncate不使用时的情况)。

copytruncate:创建副本后就地截断原始日志文件,而不是移动旧日志文件并选择性地创建新日志文件。当某些程序无法关闭其日志文件并因此可能继续永久写入(附加)前一个日志文件时,可以使用此选项。请注意,复制文件和截断文件之间的时间间隔非常短,因此可能会丢失一些日志数据。使用此选项时,create 选项将不起作用,因为旧日志文件仍保留在原处。

相关内容