2014-09-30 64 views
3

所以我有这个小脚本检查特定行两个日志文件和行进行比较。 该脚本用于多个不同的Windows Bamboo代理。但在一个它只是挂起,并没有退出。由于在竹子中使用脚本,因此当该脚本不能退出时,整个作业会挂起。 当我通过远程访问检查计算机并杀死脚本时,作业继续进行,直到它再次到达脚本。Perl脚本挂起无故

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

#! /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--------------------- 
+4

您无法确定它是否挂起,也许它正在读取非常大的文件? '$ | = 1;'在顶部,'打印'。“除非$。 %1000;'每个'while'里面 – 2014-09-30 09:19:59

+0

我无法确定,这是正确的。但文件并不大。 300到2000行之间。这些应该在1100分钟内解析。 – 2014-09-30 09:25:52

+0

另外,仔细分析'#do stuff'部分。 – choroba 2014-09-30 09:31:25

回答

0

如果你的文件是不会被其他进程被同时写入,或者锁定的只是正常的磁盘文件,或类似的东西,那么就没有什么在你这里应该挂码。如果这些文件都是合理的大小,那么您在这里的代码应该通过文件读取并完成。

但是,如果一个文件被锁定,或者是非常大的,或者如果你有其他的代码可能会卡在一个无限循环,这可以解释为什么你的程序是挂。