我正在創建一個日誌解析器,可以在寫入日誌時「流」日誌。 日誌駐留在遠程主機上,所以我使用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;
}
嗯......你是什麼意思在「打開我的$ pipe,$ SSH或錯誤($ errMsg)」錯誤?你的意思是「死」嗎? – 2011-09-28 14:18:28
錯誤完成與die相同的事情......但它會打印$ errMsg,其他一些調試信息,然後使用失敗代碼調用exit。 – trialUnplugged
我從來沒有聽說過它,perldoc錯誤或perldoc -f錯誤都沒有提供任何結果。此外,在單線程中嘗試「錯誤」會導致「未定義的子程序和main :: error被調用......」。這是否是某個模塊的一部分(它似乎不是'Carp'的一部分)?你使用的是什麼版本的Perl? – 2011-09-28 15:15:26