perl - 跨轮换监视 Perl 中的文件内容

标签 perl file

下午好,

我有一个小的 Perl 脚本,它基本上模拟了 tail -f Minecraft server.log 上的功能。该脚本检查某些字符串并以各种方式运行。

脚本的简化版本如下:

#!/usr/bin/perl

use 5.010;
use warnings;
use strict;

my $log = "PATH TO LOG";
my $curpos;

open(my $LOGFILE, $log) or die "Cannot open log file";

# SEEK TO EOF
seek($LOGFILE, 0, 2);

for (;;){
        my $line = undef;

        seek($LOGFILE,0,1);  ### clear OF condition
        for($curpos = tell($LOGFILE); <$LOGFILE>; $curpos = tell($LOGFILE)){
                $line = "$_ \n";


                if($line =~ /test string/i){
                        say "Found test string!";
                }
        }

        sleep 1;
        seek($LOGFILE,$curpos,0); ### Setting cursor at the EOF
}

当我有一个测试服务器时,一切似乎都运行良好。在生产中,server.log 文件会轮换。当日志被轮换时,脚本会保留原始文件,而不是替换它的文件。
IE。 server.log 正在被监控,server.log 被移动并压缩到 logs/date_x.log.gz,server.log 现在是一个新文件。

如何调整我的脚本以监视文件名“server.log”,而不是当前称为“server.log”的文件?

最佳答案

您是否考虑过只使用 tail -F作为脚本的输入:

tail -F server.log 2>/dev/null | perl -nE 'say if /match/'

这将监视命名文件,将每一行传递给 STDIN 上的脚本。它只会正确跟踪 server.log,如下所示:
echo 'match' >server.log

(按脚本匹配)
mv server.log server.log.old
echo 'match' >server.log

(也匹配)

您可以打开tail -F作为 Perl 中的文件,使用:
open(my $fh, '-|', 'tail -F server.log 2>/dev/null') or die "$!\n";

关于perl - 跨轮换监视 Perl 中的文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836307/

相关文章:

perl - 如何优化检查目录是否存在的 Perl 代码?

python - 从文本生成关键字的简单方法是什么?

java - 为什么无法在 Java 中向文件添加文本?

c - 处理输入文件时如何向前看(处理 2 行)

c - 在 C 中写入指向文件的指针

perl - 如何在 Perl 中格式化日期?

perl - CGI.pm 通常在哪里创建临时文件?

Perl - 抑制控制台输出?

Android:android.content.res.Resources$NotFoundException:字符串资源 ID #0x5

java - 如何将 Excel 工作表中的第一行(标题)存储在一个 HashMap 中,并将列数据存储在另一个 HashMap 中