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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пинг целой подсети 
V
    Опции темы
fedottt
Дата 17.1.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



наваял вот такое...
сделано для пингования вагона ip (порядка 6к)
скрипт должен брать из базы и туда же скидывать результат пинга. 
необходимо для мониторинга. на данный момент лучшего решения с использованием БД Mysql не придумал ((
короче говоря, у меня этот костыль отрабатывает первые 400 хостов как положено, а потом где-то зацикливается и поедает всю память на сервере. сьел 10 гиг и уложил систему.

можете глянуть, где я допустил ошибку? 
чуствую что метод написания скриптов а-ля php в перле не канает.. 

должен был делать такое:
взял в базе 400 ip, на них склепал 400 нитей, выполнил, взял следующие 400, нити и так далее..
но где-то затык(

Код

#!/usr/bin/perl
use Benchmark;
use DBI;
use Net::Ping;
use threads;

$db="ping";
$host="localhost";
$userid="user";
$passwd="pass";
$connectionInfo="dbi:mysql:$db;$host";

$dbh = DBI->connect($connectionInfo,$userid,$passwd);

for($g=0;$g<18;$g++){

    # чистим
    unlink ("LOG");
    unlink ("LOG2");

    $#hz = -1;
    $#hzz = -1;
    $#arr_ip = -1;
    $#arr_i = -1;
    $#threads = -1;

    $sec=$sec+400;
    if($i!=0){$fir=$sec-399;}else{$fir=0;}


    # запрос на выборку
    $query = "select ip as HOST from users limit $fir,$sec";
    $sth = $dbh->prepare($query);
    $sth->execute();
    $sth->bind_columns(\$HOST);


    while ($pf=$sth->fetchrow_hashref){
        $hzz.=$pf->{HOST}."|";
    }

    @hz=split(/[|]/,$hzz);


    for ($i=0; $i<=$#hz; $i++) {
        push @threads, threads->create(\&pong, $hz[$i]);
    }


foreach $thread (@threads) {
        $thread->join();
    }
    
sub pong {
    $time1 = new Benchmark;
    my $sdp = Net::Ping->new("icmp",1,1);
    if ($sdp->ping($hz[$i])){
        open(F1,">> LOG");
        print (F1 "$hz[$i]\n");
        close (F1);
        
        open(F2,">> LOG2");
        print (F2 "1\n");
        close (F2);
    }else{
        open (F1,">> LOG");
        print (F1 "$hz[$i]\n");
        close (F1);

        open (F2,">> LOG2");
        print (F2 "0\n");
        close (F2);
    }
    open(FILE, "<", "LOG");
    while(<FILE>) {
        chomp;
        push(@arr_ip, $_);
        #print "array element: $_\n";
    }
    close(FILE);
    open(FILE2, "<", "LOG2");
    while(<FILE2>) {
        chomp;
        push(@arr_i, $_);
        #print "array element: $_\n";
    }
    close(FILE2);
    
    for($t=0; $t<=$#arr_ip; $t++){
        #print "update users set ping=$arr_i[$t] where ip=$arr_ip[$t]\n";
        open (FF1,">> LOG2ALL");
        print (FF1 "$t -- update users set ping=$arr_i[$t] where ip=$arr_ip[$t]\n");
        close (FF1);
    }
    
    $time2 = new Benchmark;
    $timebenchmark = timediff($time1, $time2);
    print "Time", timestr($timebenchmark);
    
}
   }               
;


PM MAIL ICQ   Вверх
mvsgt
Дата 18.1.2010, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ошибка в подходе. Пинговать надо с помощью nmap, а для мониторинга использовать специальные программы.

Скрипт сначала следовало бы сократить раза в 2 за счёт использования File::Slurp для записи в файлы, потом use strict; добавить, а без него искать ошибки - себя не уважать, уж извините.

PS 

C потоками Вы как-то вольно работаете, с переменными как будто они общие. Замыкания чуть-чуть исправляют ситуацию, но глюков это только прибавляет. И вообще такое ощущение, что программа не на перле написана. use strict обязательно добавляйте, сразу поёмёте что написали какую-то жуть.

Это сообщение отредактировал(а) mvsgt - 18.1.2010, 02:31
PM MAIL   Вверх
DurRandir
Дата 18.1.2010, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не используйте потоки. Потоки в перл - зло. Посмотрите на AnyEvent::FastPing, и вообще event-driven подход как полную замену потокам при работе с сетью.

PS: у вас, конечно, странный код, но это пройдёт smile Из явных ошибок - запись/чтение в лог-файл не синхронизирована (а чтение - вообще непонятно зачем), если 2 потока будет писать одновременно, то будет мусор.
PM   Вверх
krypt3r
Дата 18.1.2010, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Пинговать надо с помощью nmap

+1, зачем вЕлики клепать
Код

$ nmap -sP 192.168.1.1/24

Про use strict из перл-кодеров вообще единицы знают
PM MAIL   Вверх
amg
Дата 18.1.2010, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



К старым версиям Net::Ping прилагалась программа
fping - pings multiple hosts at once
Ее можно найти на CPAN и пользоваться (или взять из нее распаралеливающий код).
PM MAIL   Вверх
fedottt
Дата 18.1.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



nmap решил вопрос)))
спасибо вам)

код у меня такой кривой, бо привык в php. perl пока не дается.
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.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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