Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Помгите создать дочерние процессы


Автор: StealtH 4.10.2004, 02:51
Такая возникла трабла, нужно создать несколько дочерних процессов, точнее 255, а создается только 64. С чем это связано, и как это можно исправить. Подскажите пожалуйста, или подкинте ссылочку на документацию, плиз

Автор: chaos 4.10.2004, 09:48
Возник вопросик нах тебе столько процессов??? rolleyes.gif

Автор: StealtH 4.10.2004, 10:51
Цитата(chaos @ 4.10.2004, 09:48)
Возник вопросик нах тебе столько процессов??? rolleyes.gif

Ну о-о-о-о-о-чень нужно biggrin.gif

Автор: GoodBoy 4.10.2004, 11:03
StealtH
А ты уверен, что другова пути нет????

Автор: ElectricalStorm 4.10.2004, 13:07
ключевые слова: fork, use threads, use Threads;

Автор: StealtH 4.10.2004, 18:04
Цитата(GoodBoy @ 4.10.2004, 11:03)
StealtH
А ты уверен, что другова пути нет????

Пробовал делать через дескрипторы файлов, через system, через обратные кавычки, везде один и тотже результат, может это операционка накладывает свои ограничения, если так, то где почитать как с этим бороться.
Добавлено @ 18:05
Цитата(ElectricalStorm @ 4.10.2004, 13:07)
ключевые слова: fork, use threads, use Threads;

Не помогаетsad.gif

Автор: GoodBoy 4.10.2004, 18:06
StealtH
Нет, ты не понял!!!!! Опиши задачу!!! Может есть другой путь решения, чем плодить процессы!!!!!

Автор: StealtH 5.10.2004, 02:21
Цитата(GoodBoy @ 4.10.2004, 18:06)
StealtH
Нет, ты не понял!!!!! Опиши задачу!!! Может есть другой путь решения, чем плодить процессы!!!!!

Вообщем суть дела такова. Есть определенный диапазон IP-адресов(большой), который нужно отслеживать на наличие различных сервисов(Apache, фтп, и т.д.). Есть скрипт, который все это прекрасно делает(сам написал), суть работы такова, сначала пингуем хост, а потом производим с ним остальные действия. Т.к. хостов много около 1000, то, нужно, чтоб сервер их пинговал сразу и по многу, т.е. брал маску адреса(типа 192.168.100.) а остальные цифры последнего актета подставлял сам скрипт, и результаты выбрасывал в текстовый файл с именем аналогичным хосту, потом берет из папки с результатами(т.е. файлами результатов пинга) обрабатывает. Почему нужно много и сразу, потому что результаты должны обновлятся через короткие промежутки времени. Пробовал использовать Net::Ping, но результаты пинга больше чем в реале раза в два-три, это(как мне объяснили) результат того, что используются библиотеки перла, которые перед трансляцией подгружаются, поэтому именно из-за этого вариант сразу отпал. Выход единственный - пинговать системной командой, и для этого запускать ее как отдельный процесс. С порождением нужного количества процессов на моем серваке(Linux Interprase)проблем нет, у меня там права рута, но в конечном итоге скрипт будет работать на сервере, где у меня таких прав не будет, да и скрипту их никто не даст(он будет работать с консольном режиме и запускаться через crontab). Поэтому вот и приходится находить другие пути. Вот в принципе практически все.

Автор: GoodBoy 5.10.2004, 10:10
Цитата(StealtH @ 5.10.2004, 03:21)
Пробовал использовать Net::Ping, но результаты пинга больше чем в реале раза в два-три, это(как мне объяснили) результат того, что используются библиотеки перла, которые перед трансляцией подгружаются, поэтому именно из-за этого вариант сразу отпал.

Цитата(StealtH @ 5.10.2004, 03:21)
С порождением нужного количества процессов на моем серваке(Linux Interprase)проблем нет

А теперь представь СКОЛЬКО системных ресурсов тебе надо, чтобы запустить 256 клонов своего скрипта, КАЖДЫЙ из которых запустит свою версию интерпретатора Перл... Ты уверен, что fork 256 процессов - это единственный выход???

Автор: StealtH 5.10.2004, 12:57
Цитата(GoodBoy @ 5.10.2004, 10:10)
А теперь представь СКОЛЬКО системных ресурсов тебе надо, чтобы запустить 256 клонов своего скрипта, КАЖДЫЙ из которых запустит свою версию интерпретатора Перл... Ты уверен, что fork 256 процессов - это единственный выход???

Ну если какой-нить другой выход есть, то подскажи пожалуйста, буду признателен.

Автор: GoodBoy 5.10.2004, 13:06
Могу предложить тебе, ну скажем к примеру, запускать 8 или 16 процессов и поделить между ними всё адресное пространство... Тогда и нагрузка на сервер будет не очень высокая и скорость работы возрастёт по сравнению с одним процессом...

Автор: Nobody 5.10.2004, 20:43
Эээ... А старый добрый nmap не устраивает?

Автор: StealtH 5.10.2004, 20:46
Цитата(GoodBoy @ 5.10.2004, 13:06)
Могу предложить тебе, ну скажем к примеру, запускать 8 или 16 процессов и поделить между ними всё адресное пространство... Тогда и нагрузка на сервер будет не очень высокая и скорость работы возрастёт по сравнению с одним процессом...

По подробнее если можно, потому что я с этим не сталкивался, и понятия не имею, или ссылочку где почитать по данному поводу.

Автор: GoodBoy 6.10.2004, 10:01
StealtH
Ну смотри, есть у тебя скрипт, который опрашивает удалённый хост. К примеру по крону ты запускаешь 8 экземпляров этого скрипта с параметрами:
Код
./search.pl 0 31
./search.pl 32 63
./search.pl 64 96
       ...
./search.pl 223 255

а в самом скрипте читаешь начальное и конечное значение последнего сегмента адреса

Код
my $start = shift @ARGV;
my $end = shift @ARGV;

и дальше простейший цикл:
Код
for (my $last_addr=$start; $last_addr<=$end; $last_addr++) {
       my $full_addr = "192.168.100.$last_addr";

# И вперед - делать всё, что нужно!!!

}

Таким образом каждый из 8 процессов обработает свои 32 хоста...

Автор: StealtH 6.10.2004, 19:00
Цитата(GoodBoy @ 6.10.2004, 10:01)
StealtH
Ну смотри, есть у тебя скрипт, который опрашивает удалённый хост. К примеру по крону ты запускаешь 8 экземпляров этого скрипта с параметрами:
Код
./search.pl 0 31
./search.pl 32 63
./search.pl 64 96
       ...
./search.pl 223 255

а в самом скрипте читаешь начальное и конечное значение последнего сегмента адреса

Код
my $start = shift @ARGV;
my $end = shift @ARGV;

и дальше простейший цикл:
Код
for (my $last_addr=$start; $last_addr<=$end; $last_addr++) {
       my $full_addr = "192.168.100.$last_addr";

# И вперед - делать всё, что нужно!!!

}

Таким образом каждый из 8 процессов обработает свои 32 хоста...

Т.е. таким образом постараться объеденить несколько задач в одну, используя входные параметры скрипта.

Но тогда при этом, снизится скорость работы скрипта. Вообщем неплохая идея, где про это можно более подробно почитать?

Автор: GoodBoy 7.10.2004, 09:50
Цитата(StealtH @ 6.10.2004, 20:00)
Но тогда при этом, снизится скорость работы скрипта.

Ну, как ты можешь сам догадаться, нельзя одновременно кушать рыбу и карабкаться на дерево... wink.gif Нужно искать золотую середину...

Автор: StealtH 7.10.2004, 13:00
Цитата(GoodBoy @ 7.10.2004, 09:50)
Цитата(StealtH @ 6.10.2004, )
Но тогда при этом, снизится скорость работы скрипта.

Ну, как ты можешь сам догадаться, нельзя одновременно кушать рыбу и карабкаться на дерево... wink.gif Нужно искать золотую середину...

Вообщем смысл такой, сервак от количества процессов загнуться не должен(я так думаю), но самое главное точность и скорость, это основной принцип работы скрипта.

Да и вот еще маленький ньюанс, скорее я бы даже сказал просьба, подкинь ссылочку, если таковая имеется, на ресурс, где можно почитать про разделение памяти между процессами, если там будут примеры будет ваще рульно, моя признательность не будет знать границ(в будующем сочтемся)

Да и еще чуть не забыл, ресурсы не важно, но только вот чтоб траблов с доступом к ним не было в связи с тем, что запускаться скрипт будет не от рута, это тоже не мало важный ньюанс.

Автор: GoodBoy 7.10.2004, 13:03
Цитата(StealtH @ 7.10.2004, 14:00)
Вообщем смысл такой, сервак от количества процессов загнуться не должен(я так думаю), но самое главное точность и скорость, это основной принцип работы скрипта.

тогда запусти 64 процесса, и каждый из них пусть обработает по 4 хоста!!!!

Цитата(StealtH @ 7.10.2004, 14:00)
подкинь ссылочку, если таковая имеется, на ресурс, где можно почитать про разделение памяти между процессами

Сорри, не знаю...

Автор: StealtH 7.10.2004, 20:24
Цитата(GoodBoy @ 7.10.2004, 13:03)
тогда запусти 64 процесса, и каждый из них пусть обработает по 4 хоста!!!!

Ты наверное не понял сути вопроса, мне нужно именно пинг запустить в таком количестве экземпляров, результаты пинга складываются в файлик, а потом сканить порты на запущенные серивы, тоже в несколько потоков. В итоге сервак надрывается меньше минуты и сразу выдает результат.

Код

...............
$hostmask='192.168.1.';
for(my $i=0; $i<=255;$i++){
 $host=$hostmask."$i";
 `ping -с 4 -q $host >./out/$host`;
}
sleep(300000);# к примеру, подождать пока пинг пройдет
my @dir=`ls out`;

for (my $i=0; $i<=$#dir; $i++){
 open(FILE, "$dir[$i]");
 @line=<FILE>;
 close(FILE);
...................
 for (my $i=0; $i<=$#liner; $i++){
   if(is_live($line[$i])){
    ...................
     }else {&нет мату;}

}
sub is_live
{
  my @data=shift;
.....................
#обрабатываем результат пинга
if(живой){return 1;}
else{return 0;}
}

..........................


Я почему так решил, потому-что обработать 200kb(при самом боьшом количестве хостов) гораздо проще и менее ресурсоемко, чем делать это все в каком-то цикле(сначала пинговать, а потом обрабатывать результат) дольше по времени и неизвестно как себя может повести скрипт при каких-либо ошибках(я имею ввиду какую-нить непредвиденную ситуевину, всего ведь не предусмотришь). Системного пинга в чем плюс, в том, что он выводит именно те результаты, которые есть на самом деле, а перловый пинг меня чо-то разочаровал(результаты в 3-4 раза больше чем от системного). Тем более что скрипт будет запускаться кроном и контролировать его работу будет довольно-таки сложно, а в логах его работы потом ковыряться мне особо эта перспектива не прильщает(долго и скучно).

Цитата
Сорри, не знаю...

Ну тады Яndex - найдется ф-ф-ф-ф-се smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)