Отсутствует ошибка в $ @ для Perl Net :: FTP - PullRequest
1 голос
/ 05 февраля 2012

После выяснения (конечно, через SO), что ошибка для плохого $ftp = Net::FTP->new() вызова в $@, в то время как последующие ошибки могут быть получены с помощью $ftp->message(), я сталкиваюсь с небольшой проблемой.

Мой код в основном:

while (1) {
    # Wait for cycle start, then get file list into @filelist.

    foreach $file (@filelist) {
        my $ftp = Net::FTP->new ($host);
        if (! $ftp) {
            logError ("Could not connect to host [$host]: $@");
            return;
        }
        # More FTP stuff below with $ftp->message() error checking.
        $ftp->quit();
    }
}

В стороне: да, я знаю, что, вероятно, я могу сделать это за один сеанс FTP, но на данный момент есть веские причины оставить его в отдельных сеансах.

Теперь это вызывается в цикле, один раз на файл, и все идет на один и тот же хост, но я получаю немного другое поведение с первой попытки в большинстве циклов.Сценарий является долгосрочным, каждый цикл начинается с часа и получаса, поэтому это не проблема с первой попыткой после запуска программы, поскольку он происходит и в циклах, отличных от первого.

Теперь я знаю , что эти соединения должны прерваться, просто потому, что машины, к которым я пытаюсь получить доступ, недоступны в моей сети разработки.

Проблема в том, что ошибки появляются вфайл журнала:

E 2012-02-05 18:00:13 Could not connect to host [example.com]: 
E 2012-02-05 18:00:13 Could not connect to host [example.com]:
    Net::FTP: connect: Connection refused
E 2012-02-05 18:00:14 Could not connect to host [example.com]:
    Net::FTP: connect: Connection refused

Как видите, переменная $@, кажется, не заполнена первым файлом цикла.Я немного отредактировал этот вопрос, так как только что заметил, что в последнем цикле были все три строки с сообщением об ошибке.Возвращаясь к журналам с помощью команды:

grep refused logfile | awk '{print substr($3,1,5)}' | uniq -c

, чтобы получить даты и счет, выдает следующую статистику:

  3 11:00
  3 11:30
  3 12:00
  3 12:30
  3 13:00
  3 13:30
  2 14:00
  3 14:30
  3 15:00
  3 15:30
  3 16:00
  2 16:30
  2 17:00
  2 17:30
  2 18:00
  2 18:30
  2 19:00
  3 19:30

, указывающую, что некоторые имеют правильное количество сообщений об ошибкахно не все.

Интересно, кто-нибудь знает, почему это так.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

Попробуйте обновить http://cpansearch.perl.org/src/GBARR/libnet-1.22_01/Changes говорит

libnet 1.22_01 -- Mon May 31 09:40:25 CDT 2010
*Set $@ when ->new returns undef

Если вы используете версию libnet до 1.22_01, в функции new была небольшая ошибка в ответах, которые не начинались с кода.

Например, FTP.pm 2.77 из libnet 1.21 имеет следующий фрагмент:

unless ($ftp->response() == CMD_OK) {
    $ftp->close();
    $@ = $ftp->message;
    undef $ftp;
}

С FTP.pm 2.77_2 из libnet 1.22_01 это изменяется на:

unless ($ftp->response() == CMD_OK) {
    $ftp->close();
    # keep @$ if no message. Happens, when response did not start with a code.
    $@ = $ftp->message || $@;
    undef $ftp;
}
0 голосов
/ 05 февраля 2012

Что-нибудь происходит между вызовом ->new и печатью $@?Он может перезаписать значение $@, поэтому, если это необходимо, сохраните значение для дальнейшего использования:

my $ftp = Net::FTP->new ($host);
my $potential_error = $@;

$whatever_that->can_call(eval => 'inside');

if (! $ftp) {
        logError ("Could not connect to host [$host]: $potential_error");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...