我用Perl编写了一个脚本,它基本上是多文件文件(使用Perl库File::MultiTail):在拖尾每行之后它会做很多其他的事情,但这是另一个故事,所以我只是根据这个部分粘贴一个简历导致问题的代码:
#!/usr/bin/perl
use File::MultiTail;
$path="my/path";
$files="*.log";
sub first{
$True=0;
my $file=MultiTail->new(OutputPrefix => 'f',
Files => ["$path"],
RemoveDuplicate => $True,
ScanForFiles => "0");
while(defined(my $line=$file->read)) {
print"$line\n";
$file->update_attribute(Files => ["$path"]);
}
}
&first();
脚本运行良好:每次出现新的日志行时,它会从多个文件中删除每一行,但我的问题是这个脚本使用100%的CPU,我想知道如何让它不是检查文件在每一秒钟,我可以像睡眠一样延迟10;它确实解放了CPU,但我需要实时查看这些行,我不知道如何解决它。
答案 0 :(得分:1)
似乎File::MultiTail
是一段旧代码(1998):也许它没有以有效的方式进行文件检查,或者随着文件数量的增加而无法很好地扩展。
在while循环中进行尽可能多的I / O检查,看起来浪费了CPU时间。
也许您可以使用更新的模块File::Tail来节省I / O上的CPU周期,因为该模块非常努力地不要“忙等待”。
我在考虑这样的事情:
#!/usr/bin/env perl
use 5.012;
use strict;
use File::Tail;
my @logs = glob '/var/log/*.log';
my @tails = ();
foreach ( @logs ) {
push @tails, File::Tail->new( $_ );
}
foreach ( @tails ) {
while ( defined ( my $line = $_->read ) ) {
say $line;
}
}
为了知道这个CPU是否比File::MultiTail
更加友好,你必须检查CPU时间(真实,用户,系统)。
答案 1 :(得分:1)
我认为answer正是您所寻找的。请参阅usage of select with File::Tail from CPAN。