【问题标题】:Perl script hangs for no reasonPerl 脚本无故挂起
【发布时间】:2014-11-24 20:26:27
【问题描述】:

所以我有这个小脚本,它检查两个日志文件的特定行并比较这些行。 该脚本用于几个不同的 Windows Bamboo Agents。但是在其中一个它只是挂起并且不退出。由于该脚本在竹子中使用,因此当该脚本不退出时,整个作业都会挂起。 当我通过远程访问检查计算机并终止脚本时,作业将继续,直到它再次到达脚本。

这是脚本,由另一个脚本启动。

#! /usr/bin/perl
my $naluresult = 2;
my $hevcresult = 2;
my $hevcfailed = 0;

use strict;
use warnings;

#---------------------------------------------
#check for $ARGV[0] and $ARGV[1]

open( my $nalulog, "<", $ARGV[1] )
    or die "cannot open File:$!\n\n";
while (<$nalulog>) {
    chomp;
    $_ =~ s/\s+//g;
    if ( $_ =~ m/MD5:OK/ ) {
        $naluresult = 1;
    } else {
        if ( $_ =~ m/MD5:MISSING/ ) {
            $naluresult = 0;
        }
    }
}
close $nalulog;

#---------------------------------------------

open( my $hevclog, "<", $ARGV[0] )
    or die "cannot open File:$!\n\n";

while (<$hevclog>) {
    chomp;
    $_ =~ s/\s+//g;
    if ( $_ =~ m/MD5check:OK/ ) {
        $hevcresult = 1;
        last;
    } else {
        if ( $_ =~ m/MD5check:FAILED/ ) { $hevcfailed = 1; }
    }
    if ( $hevcfailed == 1 ) {
        #do stuff
    }
}
close $hevclog;

#---------------------------------------------

if ( $hevcresult == 2 ) {
    print("Missing MD5 status in HEVC Output");
    exit(-1);
} elsif ( $naluresult == 2 ) {
    print("Missing MD5 status in NALU Output");
    exit(-2);
} else {
    if ( $naluresult == $hevcresult ) { exit(0); }
    else {
        #different if-statements to print() to log
        exit(1);
    }
}

#---------------------EOF---------------------

【问题讨论】:

  • 你不能确定它是否挂起,也许它正在读取非常大的文件? $| =1; 在顶部,print "." unless $. %1000; 在每个 while
  • 我不能确定,没错。但是文件没有那么大。在 300 到 2000 行之间。这些应该在不到 1100 分钟内被解析。
  • 另外,仔细分析#do stuff部分。
  • 强制文件锁定文件?我同意mpapec,插入一些进度消息以找出它挂起的位置。它必须是文件 I/O 操作之一(很可能是打开或写入)。
  • #do stuff 部分只检查另外 4 行并将 $hevcresult 设置为特定数字。其中三个 if 语句:if($_ =~ m/Stringtolookfor/{$hevcresult = -1;}

标签: windows perl


【解决方案1】:

如果您的文件只是普通的磁盘文件,没有被其他进程同时写入、锁定或类似的东西,那么您在此处的代码中没有任何内容应该挂起。如果文件的大小都合理,则此处的代码应通读文件并完成。

但是,如果其中一个文件被锁定,或者非常大,或者如果您有其他可能陷入无限循环的代码,则可以解释您的程序挂起的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2013-06-17
    • 2019-04-26
    • 1970-01-01
    • 2011-04-05
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多