Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Wells

Страницы: [1]
1
Perl / Файловый монитор
« : 06 Мая 2005, 10:59:49 »
Ну поставил я себе Komodo.
И как там посмотреть???
Если запустить дебагинг, то после шага my $objNotify=...
$objNotify становится равен Win32::ChangeNotify=SCALAR(0x15d5224).
И все

2
Perl / Файловый монитор
« : 29 Апреля 2005, 11:57:04 »
Отладчик всё время пишет:
0  Win32::ChangeNotify=SCALAR(0x15d5224)
   -> 88
Ничего не меняется с момента инициализации $objNotify и до выхода.
Если ещё раз запустить изменяется то что в скобках и после стрелки????????

3
Perl / Файловый монитор
« : 28 Апреля 2005, 11:46:34 »
С циклом разобрался (PrimalScript перехватывал вывод):

use strict;
require Win32::ChangeNotify;
my $Path=\'D:\\DATA\';
my $WatchSubTree=1;
my $Events=\'LAST_WRITE\';
my $objNotify=Win32::ChangeNotify->new($Path,$WatchSubTree,$Events);
while (1) {
    $objNotify->wait();
    print "Something changed\\n";
    $objNotify->reset();
}
$objNotify->close();

А как узанть, что конкретно изменилось в каталоге? Какой файл и что в него дописалось?
print $objNotify выдаёт Win32::ChangeNotify=SCALAR(0xbe7c94)
И что с этим делать??????

4
Perl / Файловый монитор
« : 28 Апреля 2005, 09:51:47 »
Привет всем! Не являясь большим спецециалистом по PERL\'у, иногда предпочитаю писать на нём. Особенно учитывая все его прелести. Поэтому, если вопросы будут дурацкие - уж извиняйте.
Есть проблема: на Win серваке нужно мониторить каталог на предмет изменения и добавления файлов. Файлы в формате CSV. Каждый день добавляется новый файл и в него весь день пишется инфа. Все изменения нужно сбрасывать в SQL. Сейчас работает следующий вариант: на SQL серваке крутиться DTS пакет который раз в день забирает с расшаренной директории новый файл(за прошедший день) и закачивает его в базу. Нужно, что бы изменения отражались в базе не раз в день, а сразу. Ну и как-то покрасивее хочется сделать.
Решил написать скрипт, который на серваке с файлами крутился бы в фоне и мониторил каталог.
Всё что нарыл - Win32::ChangeNotify

use strict;
require Win32::ChangeNotify;
my $Path=\'D:\\DATA\';
my $WatchSubTree=1;
my $Events=\'LAST_WRITE\';
my $notify=Win32::ChangeNotify->new($Path,$WatchSubTree,$Events);
$notify->wait();
print "Something changed\\n";

И то как-то криво работает. Как в цикл загнать - непонятно. Как получить,что конкретно изменилось - тоже не знаю.

5
Perl / Данные в сети
« : 03 Ноября 2004, 15:10:34 »
Нужно прочитать данные передаваемые по сети и отловленные сетевым монитором. Есть определённая посылка (394 байта) и известна некоторая информация зашитая в ней. Эта инфа известна из программы которая обрабатывает эту посылку.
Как правильно конвертировать полученные данные не прибегая к этой проге? Допустим через скрипт на PERL\'е. Скрипт я нарисовал, посылку могу принять, но как её правильно преобразовать. Она видна в том же виде как и в сетевом мониторе. Делаю unpack \'H*\' или unpack \'h*\', получается как в сетевом мониторе или в обратном порядке. Слышал что-то про сетевой порядок данных. Что это такое? Каким редакторорм или ещё чем-то можно воспользоваться что-бы конвертнуть данные из сетевого монитора?

6
Perl / Глобальные переменные и fork
« : 28 Октября 2004, 13:40:08 »
Решил слепить тоже самое через Thread\'ы.
Получается следующее:

use strict;
use Thread qw(async yield);
my $var = 0;
sub child {
    {
        lock $var;
        if ($var == 0) {
            yield;
            $var++;
            print "var is $var\\n";
        }
    }
}
my $t2 = new Thread \\&child;
$t2->join;
print "var is $var\\n";

Почему в конце $var всё равно принимает старое значение?

7
Perl / Глобальные переменные и fork
« : 28 Октября 2004, 10:53:08 »
Смысл в следующем:
Пишу сетевой сканер для служебных целей.
Сканируемая сеть около 10000 узлов.
С одним потоком сканирование занимает более 3 часов.
Нужно ускорить этот процес. Решил разбить на 5 потоков (через fork). Процесс ускорился до 45 минут. Но встали проблемы с оповещением.
Алгоритм примерно следующий:
1 - $isAlert = 0;
2 - создание массивов из IP адресов, по количеству потоков сканирования;
4 - создание потоков сканирования (через fork);
5 - для каждого адреса выполняется определённая проверка. Если условие выполняется, то переходим к следующему адресу. Если нет, то нужно $isAlert присвоить 1;
6 - ожидаем окончания работы всех потоков;
7 - формируем лог;
8 - если $isAlert = 1 отправляем лог по почте админу.
9 - выход.
Всё работает. Не могу побороть только пункт 8. Точнее с 1 потоком никаких проблем нет. А больше не идёт!

P.S. PERL\'ом я занялся месяц назад. Так что жду снисхождения.

8
Perl / Глобальные переменные и fork
« : 27 Октября 2004, 18:41:24 »
В том то и вопрос, что если в процессе потомке что-то делать, то распаралеливание процессов не получается. Например если в ветку else засунуть

my $i = 0;
for ($i; $i<=10 ; $i++) {
   Time::HiRes::sleep(1.0);
}

то весь скрипт выполняется в пять раз дольше!!!

9
Perl / Глобальные переменные и fork
« : 27 Октября 2004, 16:30:07 »
To NeoNox: Я понимаю - ты профи и для тебя это туфта, но у меня ничерта не получается! Вот так не работает:

use IO::Handle;
use strict;
my $threads = 5;
pipe(READER, WRITER);
autoflush WRITER;
my ($pid,  $line);
my $threads = 5;
for (my $i = 1; $i <= ($threads); $i++) {
if ($pid = fork) {
    close WRITER;
    chomp($line = );
    #print $line;
    close READER;
    waitpid($pid,0);
}
else {
    die "cannot fork: $!" unless defined $pid;
    close READER;
    print WRITER "4"; #This value will be sent to $line
    close WRITER;  # this will happen anyway
    exit;
}
}
print $line;

10
Perl / Глобальные переменные и fork
« : 27 Октября 2004, 15:44:41 »
To NeoNox: Всё работает! Спасибо! Только я вот не зря весь кусок кода вывалил. У меня там есть цикл, в котором 5 раз вызываются потомки. Так вот, как в конце проверить записал потомок что-то или нет? С одним потомком всё работает! А как с пятью быть???

11
Perl / Глобальные переменные и fork
« : 27 Октября 2004, 09:34:20 »
Если бы я сам мог разобраться - сюда не писал бы!!!!
To NeoNox: твой код выдаёт:
\'-\' is not recognized as an internal or external command,
operable program or batch file.
P.S. И какой это я "ненужный" код "вывалил"? Я "вывалил" свой скрипт! И всё!

12
Perl / Глобальные переменные и fork
« : 26 Октября 2004, 18:34:49 »
Есть следующий код:

use strict;
use Benchmark;
my $tmStamp1 = new Benchmark;
#/////////////////////////////////////////////////////////////////////////////////
$| = 1;
my $threads = 5;
my @pids;
my $isExit = 0;
#/////////////////////////////////////////////////////////////////////////////////
for (1 .. $threads) {
makeChild();
}
print "$isExit\\n";
for (my $i = 0; $i <= ($threads-1); $i++) {
print "$pids[$i]\\n";
waitpid($pids[$i], 0);
}
print "$isExit\\n";
#/////////////////////////////////////////////////////////////////////////////////
my $tmStamp2 = new Benchmark;
my $tmDiffer = timediff($tmStamp1, $tmStamp2);
print timestr($tmDiffer);
#/////////////////////////////////////////////////////////////////////////////////
sub makeChild {
my $pid;
die "fork: $!" unless defined ($pid = fork);
if ($pid) {
push(@pids,$pid);
return;
}
else {
my $i = 0;
for ($i; $i<=10 ; $i++) {
Time::HiRes::sleep(1.0);
}
$isExit = 1;
exit(0);
}
}
#/////////////////////////////////////////////////////////////////////////////////

Так вот $isExit не меняется перед выходом из скрипта

13
Perl / Глобальные переменные и fork
« : 26 Октября 2004, 17:17:29 »
Есть глобальная переменная. Как из процесса-потомка, вызванного через fork, записать в неё какое-то значение? (Всё под Windows)

14
Perl / UDP socket - ???
« : 08 Октября 2004, 11:19:55 »
Нужно записать в удалённый UDP порт, а затем прочитать оттуда. Написал следующее:
use strict;
use IO::Socket;
my $rem_port = 2967;
my $proto = \'udp\';
my $send_msg = "\\x00\\xCE\\x00\\x00\\x00\\xC0\\x01\\x01\\x00\\x00\\x00\\x00\\xDA\\x49\\x1F\\x10";
my $size_msg = 466;
my $objSocket = IO::Socket::INET->new(PeerAddr => \'172.17.242.1\', PeerPort => $rem_port, Proto => $proto, Type => SOCK_DGRAM, Timeout => 5);
$objSocket->send($send_msg);
$objSocket->recv(my $recv_msg, $size_msg);
if (length($recv_msg) > 0) {
print "Is OK!\\n";
}
else {
print "Is bad!\\n";
}
$objSocket->shutdown(2);

Если порт прослушивается, то всё нормально. Если нет то тоже всё OK! Но если порт закрыт, например фаерволом, то timeout не отрабатывает. А очень нужно. Всё это под Windows. ActivePerl версия 5.8.4.810

15
Perl / Проверка UDP порта
« : 27 Сентября 2004, 10:36:18 »
Помогите чайнику! Можно-ли определить работает-ли на удалённом хосте программа использующая UDP порт?

Страницы: [1]