The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"использование fork"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"использование fork"  +/
Сообщение от Trewsa on 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, каким образом контролировать какой из процессов использует ту или иную запись с массива хостов? Или есть какое то другое решение? Спасибо.
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "использование fork"  +/
Сообщение от cryo (ok) on 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.dev/openforum/vsluhforumID9/7389.html

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "использование fork"  +/
Сообщение от ACCA (ok) on 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


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру