![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Trewsa |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.5.2012 Репутация: нет Всего: нет |
Дбрый день! Написал небольшой скрипт для сбора логов с локальных серверов. Использовал среду cyqwin(perl5.10) для написания и отладки. В скрипте встречаются вызовы fork(), также использование eval и все отлично работает, но когда я поатылся запустить окружении strawberry perl или в activestate, то ни вызов fork не работает и заврешается программа в eval блоке.
Вот вызов fork, который отлично работает в cygwin и не выполняется в activestate и strawberry.
А этот фрагмент c eval{}, который тоже не выполняется в в activestate и strawberry, т.е. если встречается исключение, то останов всего скрипта.
Кто сталкивался с такими проблемами? Возможно ли, что это разница версий perl(5.10 и 5.14)? Как можно это исправить? Спасибо! |
||||
|
|||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Думаю это связано с тем, что в Windows отстутствует системный вызов fork(): http://perldoc.perl.org/perlfork.html
|
|||
|
||||
| Trewsa |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.5.2012 Репутация: нет Всего: нет |
Да, действительно. В cygwin это же побольшому счету реализация совместимости стандарта POSIX и вызов fork() присутствует.
Спасибо за подсказку с perlfork(). Теперь надо добавить корректную проверку окружения. С блоком eval{} скорее всего таже проблема, какое нибудь windows исключение, которое не отлавливается. Это сообщение отредактировал(а) Trewsa - 24.5.2012, 12:04 |
||||
|
|||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
| Trewsa |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.5.2012 Репутация: нет Всего: нет |
Проверил у себя
на конфигурации
А после несколько учебных fork-ов запустил. Вы оказались правы, проблема не в форке. Проблема оказалась
|
||||||||
|
|||||||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
1) Посмотрите баги Net::Ping - там много веселого, в несколько потоков (форков под win*) его использовать не получится.
2) Запускайте от имени администратора - обычный пользователь не может создавать raw-сокеты. 3) Посмотрите на AnyEvent::Ping, если надо распараллелить поток запросов. Да и вообще всю сеть лучше писать на AnyEvent. Но замечание из п.2 тут тоже в силе. |
|||
|
||||
| Trewsa |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.5.2012 Репутация: нет Всего: нет |
И от пользователя с админ. правами, такая же ситуация, в cygwin работает отлично, в activeperl не выполняется. Начал изучать AnyEvent, попробую переделать с его использованием, жаль что документации по нему мало. Возник другой вопрос, а есть ли модули для просмтора(опроса) сети, просто подумалось, что поиск станций таким методом foreach (@hosts) {$net->ping($_);} не очень корректно. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
на какой предмет вы хотите опрашивать?
icmp echo может быть запрешен на роутере. |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |