2011-09-28 55 views
1

我正在創建一個日誌解析器,可以在寫入日誌時「流」日誌。 日誌駐留在遠程主機上,所以我使用SSH和尾部的組合 創建文件處理程序。以下工作相當好,但我確實有一些關於錯誤處理的問題。Perl:作爲文件處理程序的SSH尾部

  • 如果在報警延遲到期之前用戶沒有輸入SSH連接的密碼,報警將開始觸發。這導致控制檯被清除,因此不清楚是否需要輸入密碼。

  • 如果我輸入了錯誤的密碼,我仍然能夠導致清屏報警,等...

    Password: 
    Password: 
    Password: 
    Permission denied (publickey,keyboard-interactive). 
    
  • 如果我提供一個不存在的日誌文件名,代碼繼續。 ...

    tail: cannot open `/path_to_log/mylog.logXXXX' for reading: No such file or directory 
    tail: no files remaining 
    

所以,我的問題是什麼是最好的方式添加一些額外的錯誤處理。或者,可以將File :: Tail模塊與SSH,telnet,rlogin等結合使用以提供相同的功能?

謝謝!

my $stopMsg = "Use CTRL+C to stop streaming at any time...\n"; 
    my $SSH = sprintf "ssh %[email protected]%s tail -f %s | ", $user, $host, $log; 

    printf "Log: %s\n", $log; 
    printf "Handle: %s\n", $SSH; 

    my $errMsg = sprintf "Couldn't establish SSH connection to \"%s\":", 
       $host; 

    open my $pipe, $SSH or error($errMsg); 

    my $loadTime = time; 

    printf $stopMsg; 

    setSignalHandler('INT', sub{ stopAlarm(TRUE); }); 

    startAlarm($delay, 
       $interval, 
       sub { system "clear"; $handler->(\@sysLogArr); printf $stopMsg; }); 

    while (alarmHandlerSet()) 
    { 
     my $data = <$pipe>; 

     next unless defined $data; 

     mapSysLog(line => $data, 
        arrRef => $logRef, 
        varRef => \%sysLogVars, 
        dbRef => $dbRef); 
    } 

    clearSignalHandler('INT'); 



sub error(@) 
{ 
    my $color = "BOLD"; 
    $color = $CONFIG{errorPrinter} if ($CONFIG{colorEnable} && 
             defined $CONFIG{errorPrinter}); 

    color2PrinterRef($color)->("\nERROR: "); 

    printf "%s\n", shift; 
    printf "  %s\n", $_ foreach (@_); 
    printf "Called From: %s::%d\n", (caller)[1], (caller)[2]; 
    printf "\n"; 

    exit EXIT_FAILURE; 
} 
+0

嗯......你是什麼意思在「打開我的$ pipe,$ SSH或錯誤($ errMsg)」錯誤?你的意思是「死」嗎? – 2011-09-28 14:18:28

+0

錯誤完成與die相同的事情......但它會打印$ errMsg,其他一些調試信息,然後使用失敗代碼調用exit。 – trialUnplugged

+0

我從來沒有聽說過它,perldoc錯誤或perldoc -f錯誤都沒有提供任何結果。此外,在單線程中嘗試「錯誤」會導致「未定義的子程序和main :: error被調用......」。這是否是某個模塊的一部分(它似乎不是'Carp'的一部分)?你使用的是什麼版本的Perl? – 2011-09-28 15:15:26

回答