我正在使用下面的代码连续读取文件.我遇到的问题是,每当我运行代码时,它都会从文件的开头开始,返回整个文件,而不是从最后50行开始.

我已经查阅了文档,并try 了tail= n参数的不同值--甚至n=文件中的总行减go 50--但是我的代码每次都从文件的开头开始,而不是像我需要的那样在结尾开始.我做错了什么?

use strict;
use warnings;
use File::Tail;
my $name; #file name

my $name="/home/richard/double-take/messages.log";
my $line;
my $file=File::Tail->new(name=>$name, interval=>3, maxinterval=>3, tail=>50);

while (defined($line=$file->read)) {

    print "$line";
}

推荐答案

这里有File::Tail位作者.

当它正在读取的文件有一段时间没有更新时,File::Tail会try 变得聪明,它会以越来越长的间隔判断它(可以通过maxinterval配置),因为对未被写入的文件进行忙碌等待是没有意义的.等待adjustafter * maxinterval后,File::Tail决定文件may已从其下方旋转出go .(您也可以使用参数resetafter更改此选项).

File::Tail用户读取的许多日志(log)文件都被配置为以某种方式轮换.有些方法是关闭文件、重命名它,然后以原始名称写入新文件.为了应对这一问题,在设定的时间间隔后,File::Tailtry 重新打开文件.

问题是,当它重新打开文件时,它应该从哪里读取它?大多数常见的用例在重新打开文件时与第一次打开文件时需要不同的处理.因此File::Tail有一个特殊的参数,用于说明重新打开后如何处理文件,称为reset_tail.

默认情况下,它设置为-1(给我整个文件),因为这是最常见的用例,即"我正在阅读和分析这个文件,所以在旋转发生后,我想查看我在查看旧文件时错过的所有行".但如果您不想在重新打开后看到整个文件,只需将reset_tail设置为0或正整数即可.

我无法对池上提出的修复发表 comments ,自从我写这段代码以来,我已经很多年了,我需要审查它并重新学习它,然后才能自信地说它与其余代码相匹配.

我将try 发布一个新版本,其中包含更多文档修复,警告您可以调整的不同参数,并且可能添加"Deliver-same-inode"参数,以便当使用File::Tail的工程师确信有问题的文件将被旋转,而不是简单地重写.

Linux相关问答推荐

在Linix&;Mac中运行Reaction本机项目时出现问题

UTF-8输入和使用XGetICValues

AWK 命令根据另一列中相同的值获取列中的不同值

为什么 linux shell diff 命令有时会显示与空行相关的输出,即使存在 -B(--ignore-blank-lines)选项?

使用 PowerShell 删除重复行所需的时间比 WSL 长得多

在具有不同文件类型的文件夹中编辑多个 xml 文件 - 使用预定顺序

有没有办法确定什么代码使 linux 共享对象inflating ?

使用 AWK 过滤 Linux 输出

为什么要命令; ls -l file_doesnot_exists > /dev/null 2>&1 正在工作; ls -l 2>&1 file_doesnot_exists > /dev/null 不是

使用 sed 或 awk 在 linux 中将第一行中的一个单词替换为第二行中的另一个单词

Linux 进程在后台 - 在作业(job)中 Stopped停止?

是否可以使用 shell 脚本递归地创建文件夹?

使用 AWS CLI 进行 Bash - 无法找到凭证

如何比较两个压缩包的内容

哪个程序在给定任何文件的情况下创建一个 C 数组?

如何获取/使用 LibUUID?

如何在 Linux 上查找不包含文本的文本文件?

用于提取 IP 地址的 Linux bash 脚本

`os.symlink` 与 `ln -s`

Linux 上的 NuGet:获取响应流时出错