Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fork и eval в Activestate и starawberry 
:(
    Опции темы
Trewsa
Дата 24.5.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.5.2012

Репутация: нет
Всего: нет



Дбрый день! Написал небольшой скрипт для сбора логов с локальных серверов. Использовал среду cyqwin(perl5.10) для написания и отладки. В скрипте встречаются вызовы fork(), также использование eval и все отлично работает, но когда я поатылся запустить окружении strawberry perl или в activestate, то ни вызов fork не работает и заврешается программа в eval блоке.       
Вот вызов fork, который отлично работает в cygwin и не выполняется в activestate и strawberry. 
Код

for (@table_hosts) {
   my $pid = fork();
   die "fork cannt started: $!" unless defined $pid;
   unless ( $pid ) {
        print"Connect to $_  ";
                my $ftp=Net::FTP->new($_) or die "Can't connect: $@\n";
                $ftp->login($user,$password) or die $ftp->message;
                mkdir "data/$_"
                $ftp->get($rfile, "data/$_/report.txt");
                $ftp->quit;
            print"Complete connect\n"; 
       exit( 0 );
   }  
} 

 А этот фрагмент c eval{}, который тоже не выполняется в   в activestate и strawberry, т.е. если встречается исключение, то  останов всего скрипта.

Код

eval {
$host = new Net::Telnet (Timeout => 10,Prompt => '/[%#>] $/');
$host->open($hostname);
$host->login($username, $passwd);
};
if ($@) {
    print"So so sorry, $hostname\t$@\n";
    delete($table_h{$hostname});
    return
}



Кто сталкивался с такими проблемами? Возможно ли, что это разница версий perl(5.10 и 5.14)? Как можно это исправить? Спасибо!






PM MAIL   Вверх
Pfailed
Дата 24.5.2012, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Думаю это связано с тем, что в Windows отстутствует системный вызов fork(): http://perldoc.perl.org/perlfork.html


--------------------
PM MAIL   Вверх
Trewsa
Дата 24.5.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.5.2012

Репутация: нет
Всего: нет



Цитата(Pfailed @ 24.5.2012,  11:46)
Думаю это связано с тем, что в Windows отстутствует системный вызов fork(): http://perldoc.perl.org/perlfork.html

Да, действительно. В  cygwin  это же побольшому счету  реализация совместимости стандарта POSIX  и   вызов fork() присутствует. 
Цитата

cygwin1.dll, которая обеспечивает совместимость API и реализует значительную часть стандарта POSIX и огромная коллекция приложений, которые обеспечивают привычную среду UNIX. 

Спасибо за подсказку с perlfork(). Теперь надо добавить корректную проверку окружения.  С  блоком eval{} скорее всего таже проблема, какое нибудь windows исключение, которое не отлавливается. 
 



Это сообщение отредактировал(а) Trewsa - 24.5.2012, 12:04
PM MAIL   Вверх
DurRandir
Дата 24.5.2012, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



>perl -e "print defined fork()?($$, qq!\n!):0"
15844
-18364

>perl -V
Summary of my perl5 (revision 5 version 10 subversion 1) configuration:

  Platform:
    osname=MSWin32, osvers=5.1, archname=MSWin32-x86-multi-thread
    uname='Win32 strawberryperl 5.10.1.2 #1 Wed Apr 28 11:51:06 2010 i386'

Так что проблема у вас не в форке (да, форк на win* имеет проблемы, но они одинаковы для _любого_ билда). Если вы не можете отловить ошибку eval'ом (скорее всего, она выскакивает не там, где вы её ожидаете), то повесьте обработчик на $SIG{__DIE__} с выводом стектрейса. Автоматически это поможет сделать Carp::Always. 

PS: у меня есть одно предположение - т.к. в винде fork - это, на самом деле, cоздание нового потока, то у вас могут быть использованы потоконебезопасные модули. Они то и падают, где-нибудь внутри XS.
PM   Вверх
Trewsa
Дата 25.5.2012, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.5.2012

Репутация: нет
Всего: нет



Цитата(DurRandir @ 24.5.2012,  13:13)

Так что проблема у вас не в форке (да, форк на win* имеет проблемы, но они одинаковы для _любого_ билда). Если вы не можете отловить ошибку eval'ом (скорее всего, она выскакивает не там, где вы её ожидаете), то повесьте обработчик на $SIG{__DIE__} с выводом стектрейса. Автоматически это поможет сделать Carp::Always. 

PS: у меня есть одно предположение - т.к. в винде fork - это, на самом деле, cоздание нового потока, то у вас могут быть использованы потоконебезопасные модули. Они то и падают, где-нибудь внутри XS.

Проверил у себя
Код

C:\>perl -e "print defined fork()?($$, qq!\n!):0"
2040
-3944

на конфигурации 
  
Код

Platform:
    osname=MSWin32, osvers=5.2, archname=MSWin32-x86-multi-thread
    uname=''
    config_args='undef'


А после несколько учебных fork-ов запустил. Вы оказались правы, проблема не в форке. Проблема оказалась

Код

my $net=Net::Ping->new('syn');
$net->hires();
foreach  (@hosts) {
    $net->ping($_);  # именно здесь не выполняется код в Activestate и Strawberry
}
while ((my $host_local, my $rtt)=$net->ack()) {
     $table_h{$host_local}=$rtt;     # и тут собственно хеш пуст
        print"$host_local\t$rtt\n"; 
}
print "Complete!\n";
}  


PM MAIL   Вверх
DurRandir
Дата 25.5.2012, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



1) Посмотрите баги Net::Ping - там много веселого, в несколько потоков (форков под win*) его использовать не получится.
2) Запускайте от имени администратора - обычный пользователь не может создавать raw-сокеты.
3) Посмотрите на AnyEvent::Ping, если надо распараллелить поток запросов. Да и вообще всю сеть лучше писать на AnyEvent. Но замечание из п.2 тут тоже в силе.
PM   Вверх
Trewsa
Дата 28.5.2012, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.5.2012

Репутация: нет
Всего: нет



Цитата(DurRandir @ 25.5.2012,  16:00)
2) Запускайте от имени администратора - обычный пользователь не может создавать raw-сокеты.
3) Посмотрите на AnyEvent::Ping, если надо распараллелить поток запросов. Да и вообще всю сеть лучше писать на AnyEvent. Но замечание из п.2 тут тоже в силе.

И от пользователя с админ. правами, такая же ситуация, в cygwin работает отлично, в activeperl не выполняется. Начал изучать AnyEvent, попробую переделать с его использованием, жаль что документации  по нему мало. Возник другой вопрос, а есть ли модули для просмтора(опроса) сети, просто подумалось, что поиск станций  таким методом  foreach  (@hosts) {$net->ping($_);} не очень корректно. 
PM MAIL   Вверх
arto
Дата 28.5.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



на какой предмет вы хотите опрашивать?
icmp echo может быть запрешен на роутере.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.