URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9464
[ Назад ]

Исходное сообщение
"использование fork"

Отправлено Trewsa , 23-Май-12 09:35 
Добрый день! Использую небольшой простенький скрипт для сбора логов.
for (@tb) {
    my $ftp=Net::FTP->new($_) or die "Can't connect: $@\n";
    $ftp->login($user,$password) or die $ftp->message;
    $ftp->get($log_fl, $_);
    $ftp->quit;
}
Где в @tb хранятся хосты для подключений.
Скрипт работает, логи собирает. Но работает очень медленно. Подскажите пожалуйста как можно использовать функцию fork(). Ведь как я понял из описания, она запускает дочерний процесс, который начинает выполнятся с места вызова. Я пока не понимаю, каким образом можно использовать эту функцию для множественного подключения к ftp, каким образом контролировать какой из процессов использует ту или иную запись с массива хостов? Или есть какое то другое решение? Спасибо.

Содержание

Сообщения в этом обсуждении
"использование fork"
Отправлено cryo , 23-Май-12 12:55 

for (@tb) {
   my $pid = fork();
   die "fork не отработал: $!"
       unless defined $pid;
   unless ( $pid ) {
       my $ftp=Net::FTP->new($_) or die "Can't connect: $@\n";
       $ftp->login($user,$password) or die $ftp->message;
       $ftp->get($log_fl, $_);
       $ftp->quit;
       exit( 0 );
   }  
}

Смотреть, например, тут - http://www.opennet.me/openforum/vsluhforumID9/7389.html


"использование fork"
Отправлено ACCA , 23-Май-12 16:40 
Только аккуратно. На каждый элемент @tb получаешь процесс. Если там сотни адресов, то устроишь fork bomb. Установи границы разумного.


my $CLIMIT = 50; # 50 children limit

for (@tb) {
    my $pid = fork() // die "fork не отработал: $!";
    unless ( $pid ) {
        my $ftp=Net::FTP->new($_) or die "Can't connect: $@\n";
        $ftp->login($user,$password) or die $ftp->message;
        $ftp->get($log_fl, $_);
        $ftp->quit;
        exit( 0 );
    }

    $CLIMIT--;
    wait() unless $CLIMIT;
    $CLIMIT++;
}

while (wait()> 0) { ; }   # Wait for all children to finish



"использование fork"
Отправлено Trewsa , 23-Май-12 17:05 
Спасибо за ответы! Немного подредактировал, все ОК! Работает. И чтобы не плодить топиков задам еще один вопрос здесь. В  скрипте также используются модули, которые не входят в стандартную установку(использовался cygwin, в нем perl -MCPAN -e shell, с дальнейшим install ).  Существуют ли приложения, пакеты или другие решения для того, чтобы можно было просто распространять скрипт для других людей. Т.е. создать наподобие установочного приложения с учетом всех зависимостей скрипта.    

"использование fork"
Отправлено ACCA , 23-Май-12 22:39 
> -MCPAN -e shell, с дальнейшим install ).  Существуют ли приложения,
> пакеты или другие решения для того, чтобы можно было просто распространять
> скрипт для других людей. Т.е. создать наподобие установочного приложения с учетом
> всех зависимостей скрипта.

В стандартном Perl - нет. Это задача package manager.
Под виндой нет никакого, поэтому для неё сделали Perl Package Manager - PPM. ActiveState поддерживает довольно удобный репозиторий.