Отсутствует ошибка в $@ для Perl Net::FTP

Выяснив (через 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 ответа

Решение

Попробуйте обновить 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;
}

Что-нибудь происходит между ->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");
}
Другие вопросы по тегам