【发布时间】:2011-11-23 16:44:17
【问题描述】:
我有一个进程需要对不断增长的日志文件进行定期处理。现在,我执行此操作的方式非常简单(如果您真的好奇,我将包含 bash 脚本)。
- 启动tail -n0 -f $FILE
- 每次迭代:
- 杀死尾巴
- 移动旧样本
- 开始新的尾巴
这解决了没有任何重叠的问题,但我担心我可能会错过 1 或 2 行。有没有更好的方法来避免重叠(和“下”重叠)?
【问题讨论】:
我有一个进程需要对不断增长的日志文件进行定期处理。现在,我执行此操作的方式非常简单(如果您真的好奇,我将包含 bash 脚本)。
这解决了没有任何重叠的问题,但我担心我可能会错过 1 或 2 行。有没有更好的方法来避免重叠(和“下”重叠)?
【问题讨论】:
通过“移动旧样本”,我假设您的意思是通过移动当前文件并用新文件替换它来旋转文件。
如果是这样,那么您可以为tail 使用--follow=name 选项而不是-f。这按名称而不是文件描述符跟随文件,即使文件被替换,它也允许它继续。然后,您可以让 tail 运行,同时替换文件,不会错过任何条目。
对于更强大的方法,还包括--retry,或者简单地使用-F,这意味着--follow=name --retry。
来自手册页:
-f, --follow[={name|descriptor}]随着文件的增长输出附加的数据;
-f、--follow和--follow=descriptor是等价的
--retry继续尝试打开文件,即使它在 tail 启动时无法访问或稍后变得无法访问 - 仅适用于
-f
-F同
--follow=name --retry
【讨论】: