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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как исп-ть файл для записи в него состояния URL 
:(
    Опции темы
ll75
Дата 5.10.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ok, let' go
*


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

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



Добрый день,
пишу скрипт который проверяет доступны ли в данный момент некоторые урлы, при недоступности 1 из них надо 
в файл записать 0, а при доступности 1,если он снова станет доступным -то выполнить действие...Ниже указан скрипт,
в котором урлы заданы в массиве,и каждый раз обрабатывается 1 урл.Но в файл у меня сохраняется только
текущее значение состояния 0 или 1.а как бы исп-ть предыдущее?

Код

#!/usr/bin/perl -w

use LWP::Simple;

@urlz=("http://ya.ru", "http://www.rambler.ru/");


        foreach $host (@urlz) {

                $content = get($host);

                        unless (defined $content) {

                                print "$host is unavailable \n";

        open (STATUS, ">>/home/slawa/scripts/status.txt")
        or die "Couldn't open file /home/slawa/scripts/status.txt for writing $!\n";
        print STATUS "$host 0\n";
        close(STATUS);

        } else {
                open (STATUS, "</home/slawa/scripts/status.txt")
                or die "Couldn't open file /home/slawa/scripts/status.txt for reading
$!\n";
                $filecontent = <STATUS>;
                print "FileContent=$filecontent\n";

                        if ($filecontent eq "$host 0") {
                                print "Server $host UP";
                                close(STATUS);
                                open (STATUS, ">>/home/slawa/scripts/status.txt")
or die "Couldn't open file /home/slawa/scripts/status.txt for writing $!\n";
                                print STATUS "$host 1\n";
                                close(STATUS);

                        } else {
                                print "Available $host \n";

                }

        }
}
sleep 5;

exec("/usr/home/user/scripts/url.pl", "startin.script")



Заранее спс.

Это сообщение отредактировал(а) korob2001 - 5.10.2006, 10:05
PM MAIL   Вверх
korob2001
Дата 5.10.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Я честно говоря не совсем понял вопрос. Но есть некоторые нюансы, на которые уже нельзя не обратить внимания:

1. Для того, что бы проверить существует ли ресурс по заданному URL, лучше всё же воспользоваться функцией head() из модуля LWP::Simple, работать будет гораздо быстрее, да и для трафика полезнее.

2. Ты открыл файл для чтения и прочитал строку, а закрываешь его только в том случае, если:
Код

if ($filecontent eq "$host 0") {
                          print "Server $host UP";
                          close(STATUS);
                          open (STATUS, ">>/home/slawa/scripts/status.txt") die "Couldn't open file /home/slawa/scripts/status.txt for writing $!\n";
                                print STATUS "$host 1\n";
                          close(STATUS);
                      } else {
                                print "Available $host \n";
                      }

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

3. Ты делаешь каждые 5 секунд системный вызов, насколько я понял, самого себя. Может лучше пересмотреть алгоритм и попробовать обойтись без вызова системы? Например засыпать в бесконечном цикле?

Поясни подробнее, чего ты хочешь добиться? Впринципе всё понятно, не ясен сам вопрос.

Это сообщение отредактировал(а) korob2001 - 5.10.2006, 10:28


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
ll75
Дата 5.10.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ok, let' go
*


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

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



ну т.е. у меня получается если 1 из урлов недоступен,а потом становится доступным в файле состояния есть 
только инфа о текущем урле...например если http://ya.ru стал доступен, в файле инфа присутствует о 
http://www.rambler.ru (последний обраьотанный из массива).Необходимо наверное сделать как-то,чтобы
в файле была инфа только из 2-х строк вида:
http://ya.ru 1
http://www.rambler.ru 0
А потом чтобы не дописывалось в файл, а новые данные,например
http://ya.ru 0
http://www.rambler.ru 1
Но в таком случае как-то ж надо сравнивать еще текущие значения с предыдущим...
Плз хелп ми,запутался...
 
PM MAIL   Вверх
nitr
Дата 5.10.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



ll75, поищи поиском на форуме, sharq приводил пример проверки работоспособности proxy. Модифицируй его код и используй smile


--------------------
PM   Вверх
ll75
Дата 5.10.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ok, let' go
*


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

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



Я нашёл только http://forum.vingrad.ru/index.php?showtopic=87458&hl= но там нет ничего про запись в файл данных о состоянии и считывании из него....

Добавлено @ 13:51 
как вообще правильно сделать,что бы писать в файл только 2 урла,т.к. в цикле обрабатывается по 1 урлу
и потом дописывается в файл,в рез-те файл постоянно растёт...?

Код

#!/usr/bin/perl -w

use LWP::Simple;

@urlz=("http://ya.ru", "http://www.rambler.ru/");


        foreach $host (@urlz) {

                $content = get($host);

                        unless (defined $content) {

        open (STATUS, ">>/home/slawa/scripts/status.txt")
        or die "Couldn't open file /home/slawa/scripts/status.txt for writing $!\n";
        print STATUS "$host 0\n";
        close(STATUS);

        } else {


Это сообщение отредактировал(а) korob2001 - 6.10.2006, 03:57
PM MAIL   Вверх
ll75
Дата 5.10.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ok, let' go
*


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

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



добавил unlink перед циклом и touch внутри цикла-теперьфайл создаётся правильно -из 2-х урлов.Но как теперь 
сравнивать состояние в файле - если 0 было, а стало 1,то ....?

Код

#!/usr/bin/perl -w

use LWP::Simple;

@urlz=("http://ya.ru", "http://www.rambler.ru/");

unlink "/home/slawa/scripts/status.txt";
        foreach $host (@urlz) {

                $content = get($host);

                        unless (defined $content) {

    system("touch /home/slawa/scripts/status.txt");
        open (STATUS, ">>/home/slawa/scripts/status.txt")
        or die "Couldn't open file /home/slawa/scripts/status.txt for writing $!\n";
        print STATUS "$host 0\n";
        close(STATUS);

        } else {
    system("touch /home/slawa/scripts/status.txt");
        open (STATUS, ">>/home/slawa/scripts/status.txt")
    ................................................
    ................................................


Это сообщение отредактировал(а) korob2001 - 6.10.2006, 03:58
PM MAIL   Вверх
korob2001
Дата 6.10.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Модератор: Используй кнопку "КОД" для вставки кода, я не могу постоянно это делать за тебя.

По теме:
1. Открывай файл для чтения.
2. Читай свой файл в массив.
3. Закрывай файл

4. Открывай файл для записи
5. В цикле проходи по массиву, разбивай строку и проверяй на доступность URL.
6. Создай условие: Если URL доступен пиши в файл этот URL, пробел, 1, если же нет, то URL, пробел, 0.
7. Закрывай файл.

PS: Это всё хорошо, но тут так и напрашивается DBM файл. В котором ключём является URL, а значением - его состояние. Тогда не придётся открывать и закрывать файл по два раза.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
ll75
Дата 6.10.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ok, let' go
*


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

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



спс,попробую так
PM MAIL   Вверх
ll75
Дата 6.10.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ok, let' go
*


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

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



почему предыдущее значение $prev{$host} пустое при изменении урла с "http://www.7rr.org/" на "http://www.7rrr.org/" в массиве @urlz , а если нет изменений состояния - она не пустая?помогите плз,запутался....

PREV:1
PREV:0
STATE: http://ya.ru 1
PREV-> http://ya.ru 1
STATE: http://www.7rr.org/ 1
PREV-> http://www.7rr.org/ 
Sending e-mail-http://www.7rr.org/ is UP
Код

#!/usr/bin/perl

use LWP::Simple;

@urlz=("http://ya.ru", "http://www.7rr.org/");


open(IN, "/home/slawa/status.txt");
while ($rec=<IN>) {
        chomp($rec);
        ($host, $val)=split(" ", $rec);
        $prev{$host}=$val;
print "PREV:$prev{$host}\n";
}
close(IN);

unlink "/home/slawa/status.txt";

        foreach $host (@urlz) {
                $content = head($host);
                system("touch /home/slawa/status.txt");

                $state="0";
                $state="1" if ($content ne "");
                open (STATUS, ">>/home/slawa/status.txt")
or die "Couldn't open file /home/slawa/status.txt for writing $!\n";
                print STATUS "$host $state\n";
                close(STATUS);

#print "PREV: $prev{$host}\n";
print "STATE: $host $state\n";
print "PREV-> $host $prev{$host}\n";

                if ($state != $prev{$host}) {

                        if ($state == 0) {
                                print "Sending e-mail-$host is DOWN\n";
                        } else  {
                                print "Sending e-mail-$host is UP\n";
       
                        }

                }


}




Добавлено @ 17:09 
ну т.е. почему   if ($state == 0) {
                                print "Sending e-mail-$host is DOWN\n";
не работает?
PM MAIL   Вверх
korob2001
Дата 7.10.2006, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Думаю причина в том, что хеш %prev заполняется из файла и когда ты запускаешь впервые свой скрипт или добавляешь в массив новый URL, то значение не инициализировано. Попробуй запусти свой код повторно и убедишься в этом.

Зачем ты удаляешь файл?
Код

unlink "/home/slawa/status.txt";

Зачем открываешь файл на добавление, а не на запись?
Код

foreach $host (@urlz) {
      $content = head($host);
      system("touch /home/slawa/status.txt");

      $state="0";
      $state="1" if ($content ne "");
      open (STATUS, ">>/home/slawa/status.txt") or die $!;     # ОТКРЫТИЕ
                print STATUS "$host $state\n";
      close(STATUS);                                      # ЗАКРЫТИЕ

Ведь IO операции не есть быстрые, а ты на каждой итерации открываешь и закрываешь файл. Может проще было бы один раз открыть файл для записи, перед циклом и после цикла закрыть его?
Это нас избавило бы от ненужного удаления файла, повысит производительность, да и ресурсы здорово сэкономит.
Вобщем:
1. Удаляй строку
Код

unlink "/home/slawa/status.txt";

2. Эту строку поставь перед началом цикла и разумеется удали её из тела цикла:
Код

open (STATUS, ">/home/slawa/status.txt") or die $!;

Заметь, что файл открывается для записи, а не для добавления, т.е. вместо >> используем >

3. Эту строку вынеси из тела цикла и поставь сразу же после закрывающей скобки цикла:
Код

close(STATUS);


4. Сразу же после строки:
Код

print STATUS "$host $state\n";

Поставь строку:
Код

$prev{$host} = $state unless exists $prev{$host};

Хотя наверное в данном случае, было бы правильнее просто присвоить 0 данному елементу хеша. Т.е.
Код

$prev{$host} = 0 unless exists $prev{$host};

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

Это сообщение отредактировал(а) korob2001 - 7.10.2006, 03:33


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
ll75
Дата 9.10.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ok, let' go
*


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

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



после замены

Код

 $prev{$host} = 0 unless exists $prev{$host};

теперь постоянно значение PREV 0...
PM MAIL   Вверх
korob2001
Дата 9.10.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Код

#!/usr/bin/perl -w
use strict;
use LWP::Simple;

my @urlz=("http://www.ya.ru", "http://www.7rr.org/");
my %prev = ();

open(IN, "status.txt") or die $!;
while (my $rec=<IN>) {
        chomp($rec);
        my($host, $val)=split(/\s+/, $rec);
        $prev{$host}=$val;
        print "PREV:$prev{$host}\n";
}
close(IN);

open (STATUS, ">status.txt") or die "Couldn't open file status.txt for writing $!\n";

foreach my $host (@urlz) {
        my $content = head($host);
        system("touch /home/slawa/status.txt");
        my $state = ($content ne "") ? "1" : "0";
        print STATUS "$host $state\n";
        $prev{$host} = 0 unless exists $prev{$host};

        #print "PREV: $prev{$host}\n";
        print "STATE: $host $state\n";
        print "PREV-> $host $prev{$host}\n";

        if ($state != $prev{$host}) {
            print $state == 0 ? "Sending e-mail-$host is DOWN\n" : "Sending e-mail-$host is UP\n";
        }
}

close(STATUS);


Это сообщение отредактировал(а) korob2001 - 9.10.2006, 20:23


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


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

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


 




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


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

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