![tail -F 有时仍会在 logrotate 上停止](https://linux22.com/image/763065/tail%20-F%20%E6%9C%89%E6%97%B6%E4%BB%8D%E4%BC%9A%E5%9C%A8%20logrotate%20%E4%B8%8A%E5%81%9C%E6%AD%A2.png)
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
正如我所怀疑的,您的日志轮换基本上是重命名当前日志文件,然后创建一个新文件。您需要使用copytruncate
logrotate 选项,该选项会保留原始日志文件及其所有属性。这将允许tail
正确跟踪它。
tail
无法跟踪不再存在的文件(copytruncate
不使用时的情况)。
copytruncate:创建副本后就地截断原始日志文件,而不是移动旧日志文件并选择性地创建新日志文件。当某些程序无法关闭其日志文件并因此可能继续永久写入(附加)前一个日志文件时,可以使用此选项。请注意,复制文件和截断文件之间的时间间隔非常短,因此可能会丢失一些日志数据。使用此选项时,create 选项将不起作用,因为旧日志文件仍保留在原处。