Perl脚本未找到最新的文件

Perl脚本未找到最新的文件,perl,nagios,icinga2,Perl,Nagios,Icinga2,我使用以下来自的perl脚本“https://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/Check-Newest-files-age-and-size-in-Diredtory/" 但在这些脚本中有一个错误。脚本未显示最新的文件。有人能找出错误吗?在该网站的评论中有人写道,第22行的错误是。我找不到它: 代码如下: # Check that file exists (can be directory or link

我使用以下来自的perl脚本“https://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/Check-Newest-files-age-and-size-in-Diredtory/" 但在这些脚本中有一个错误。脚本未显示最新的文件。有人能找出错误吗?在该网站的评论中有人写道,第22行的错误是。我找不到它: 代码如下:

# Check that file exists (can be directory or link)
unless (-d $opt_f) {
        print "FILE_AGE CRITICAL: Folder not found - $opt_f\n";
        exit $ERRORS{'CRITICAL'};
}

my $list = opendir DIRHANDLE, $opt_f or die "Cant open directory: $!";

while ($_ = readdir(DIRHANDLE))
{
    $file=sprintf("%s/%s",$opt_f,$_);
    $attrs = stat("$file");
    $diff = time()-$attrs->mtime;
    if($temp == 0)
    {
        #$temp=$diff;
        $new=$file;
    }
    if($_ ne "." && $_ ne "..")
    {
        if($diff<$temp)
        {
            $temp=$diff;
            $new=$_;
        }
        else
        {
            $temp=$diff; $new=$_;
        }
    }
}

$st = File::stat::stat($opt_f."/".$new);
$age = time - $st->mtime;
$size = $st->size;
#检查文件是否存在(可以是目录或链接)
除非(-d$opt_f){
打印“文件期限关键:未找到文件夹-$opt\u f\n”;
退出$ERRORS{'CRITICAL'};
}
my$list=opendir DIRHANDLE,$opt_f or die“无法打开目录:$!”;
while($\ux=readdir(DIRHANDLE))
{
$file=sprintf(“%s/%s”,$opt\u f,$\u);
$attrs=stat(“$file”);
$diff=time()-$attrs->mtime;
如果($temp==0)
{
#$temp=$diff;
$new=$file;
}
如果($ne“&&$ne.”)
{
如果($diffmtime);
$size=$st->size;
例如: 我在文件服务器上有一些文件(备份在.img文件中)。我使用此脚本检查最新的文件大小。如果我使用新文件创建新文件夹,检查将查找正确的文件。但是如果我创建第二个文件,检查将随时查找旧文件。如果我创建第三个文件,检查将查找正确的文件。第四个文件错误,第五个文件再次正确(依此类推)

一种简单(更容易?)的方法是使用内置的
glob
功能读取目录,而不是打开目录,然后使用简单的文件测试按创建或修改时间对文件进行排序:

my@files=sort{-M($a)-M($b)}glob“*”#或-C进行创建
#$files[0]是最新的文件
文件测试操作符的列表位于


请注意,
-C
-M
与脚本启动时间有关,因此对于长时间运行的脚本或守护程序脚本,您可能需要执行一些不同的操作。

您希望找到最早的
mtime
,因此我们将讨论以前找到的mtime与当前文件的mtime的简单比较在你发布的内容中有太多的代码…你要比较的值的第一件事就是改变它?什么

让我们重新开始

my$earlime\u mtime=-1;
我的$qfn;
while(已定义(my$fn=readdir($dh))){
下一步如果$fn=~/^\.?\z/;
my$qfn=“$dir_qfn/$fn”;
我的$stats=stat($qfn)
或警告(“无法统计\“$qfn\”:$!\n”),下一步;
my$mtime=$stats->mtime;
如果($mtime<$earlime\u mtime){
$earlime\u mtime=$mtime;
$qfn=$qfn;
}
}
如果(定义($U qfn)){
比如说$qfn;
}

脚本的最大问题似乎是第12行调用了stat的核心版本,但第13行希望输出的是File::stat::stat()。我怀疑对“.”或“…”的测试应该在while循环的顶部进行,并且所有变量都应该在使用之前定义


正如Jeremy所说,您最好对一组文件进行排序,并根据您要查找的内容推送/弹出第一个/最后一个值。

re“对于长时间运行的脚本或守护程序脚本,您可能需要做一些不同的事情。”,不。
((stat($a))[9]-X)/(24*60*60)((stat($b))[9]-X/(24*60*60)
无论
X
是什么都能工作。如果您担心的是精度,那就不用担心了。只要您的流程运行不到2.85亿年,您就很好:)谢谢,我想我的意思是,如果脚本运行时文件/文件时间发生变化,结果可能不一致,但我认为前提也不正确。抱歉。Re“脚本的最大问题似乎是第12行调用了stat的核心版本”,默认情况下,F::s将替换
stat
。它可能不会像您所说的那样调用核心
stat