Я создаю синтаксический анализатор журнала, который имеет возможность «потоковой передачи» журнала по мере его записи. Журнал находится на удаленном хосте, поэтому я создаю обработчик файлов, используя комбинацию SSH и tail. Следующее работает довольно хорошо, но у меня есть некоторые вопросы относительно обработки ошибок.
Если пользователь не введет пароль для 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 %s@%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;
}
open my $pipe, $SSH or error( $errMsg );
? Вы имеете в видуdie
? - person   schedule 28.09.2011perldoc error
, ниperldoc -f error
не дают никаких результатов. Кроме того, попыткаerror
в однострочнике привела кUndefined subroutine &main::error called at...
. Является ли это частью какого-то модуля (похоже, он не является частьюCarp
)? Какую версию Perl вы используете? - person   schedule 28.09.2011