【问题标题】:Tailing already opened file in Perl在 Perl 中拖尾已经打开的文件
【发布时间】:2015-05-29 01:21:20
【问题描述】:

我有一个子进程可以动态地将一些信息写入文件。有时我需要得到N 这个文件的最后几行。但是当父进程正在读取文件时,子进程会继续写入。
我已经读过锁定和解锁没有意义,但我不确定。我不会从父进程中写任何东西,所以我只需要打开它来阅读。
我找到了模块 File::Tail ,但不明白如何使用它来获取 N 最后行数,请提供一些简单的示例。

我还需要建议在这种情况下是否有必要使用锁定?

【问题讨论】:

  • 你为什么决定不加锁? flock 允许共享(读)锁和排他(写)锁。如果您不想在一个进程正在写入时阅读,那听起来正是这项工作的工具。
  • 请举个例子,使用任何模块读取文件的最后N行,我不想为此调用shell函数tail,它太贵太重了
  • @Sobrique:你试过用flock做任何严肃的事情吗? Linux 中有两种文件锁定机制,都可以从 Perl 访问,flock 就是其中之一。但是它们是不兼容的,并且仅适用于使用相同锁定机制的程序。见鬼。
  • 取决于你所说的“严肃”是什么意思——我已经编写了执行 OP 尝试的脚本,并且运行良好。不过,不建议将其用于 NFS 挂载或类似情况。

标签: perl file io multiprocessing tail


【解决方案1】:

要读取文件的最后 N 行,您可以使用 CPAN 模块 File::ReadBackwards

use File::ReadBackwards;

my $lastlines = File::ReadBackwards->new("file.txt");
print reverse map { $lastlines->readline() } (1 .. 2);

这将打印文件的最后两行。用你想要的任何数字替换 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多