2014-09-30 96 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

如果你的文件是不會被其他進程被同時寫入,或者鎖定的只是正常的磁盤文件,或類似的東西,那麼就沒有什麼在你這裏應該掛碼。如果這些文件都是合理的大小,那麼您在這裏的代碼應該通過文件讀取並完成。

但是,如果一個文件被鎖定,或者是非常大的,或者如果你有其他的代碼可能會卡在一個無限循環,這可以解釋爲什麼你的程序是掛。