Добрый день! Использую небольшой простенький скрипт для сбора логов.
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, каким образом контролировать какой из процессов использует ту или иную запись с массива хостов? Или есть какое то другое решение? Спасибо.
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
Только аккуратно. На каждый элемент @tb получаешь процесс. Если там сотни адресов, то устроишь fork bomb. Установи границы разумного.
my $CLIMIT = 50; # 50 children limitfor (@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
Спасибо за ответы! Немного подредактировал, все ОК! Работает. И чтобы не плодить топиков задам еще один вопрос здесь. В скрипте также используются модули, которые не входят в стандартную установку(использовался cygwin, в нем perl -MCPAN -e shell, с дальнейшим install ). Существуют ли приложения, пакеты или другие решения для того, чтобы можно было просто распространять скрипт для других людей. Т.е. создать наподобие установочного приложения с учетом всех зависимостей скрипта.
> -MCPAN -e shell, с дальнейшим install ). Существуют ли приложения,
> пакеты или другие решения для того, чтобы можно было просто распространять
> скрипт для других людей. Т.е. создать наподобие установочного приложения с учетом
> всех зависимостей скрипта.В стандартном Perl - нет. Это задача package manager.
Под виндой нет никакого, поэтому для неё сделали Perl Package Manager - PPM. ActiveState поддерживает довольно удобный репозиторий.