Видео ролики бесплатно онлайн

Смотреть гиг видео

Официальный сайт yerka 24/7/365

Смотреть видео бесплатно

uscr 29.05.2012 18:40

Есть вопрос!Скрипт пинговалка. Что я сделал не так?

Возникла идея из спортивного интереса пропинговать 2000+ хостов. Под катом результат, который делает это за 17 секунд.

Вопросы:

где я накосячил (ошибки в скрипте)?
чем чревато всё это (может ли повиснуть 100500 процессов в памяти)?
как ещё ускориться?

Работает это так:
скрипт готовит очередь и запускает в фоне 1 процесс скрипта-пинговалки на каждые 10 хостов. Пинговалка пингует и пишет хосты, статус которых изменился в файл. Третий скрипт слушает файл tail -f'ом и апдейтит запись в БД на каждую пришедшую строку.

Подготовка очереди:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat queue_prepare.sh 
#!/bin/bash

MySQL_REQUEST="select id, ip, alive"
MySQL_CONDITION="ip!='' AND ip != ' '"

TMP_FREFIX="/tmp/trash"
QUEUE_FILE="/tmp/queue"

echo "$MySQL_REQUEST FROM $MySQL_READ_TABLE WHERE $MySQL_CONDITION" | mysql -u $MySQL_READ_USER -h $MySQL_READ_HOST --password $MySQL_READ_PASS $MySQL_READ_DB > $QUEUE_FILE

#отрезаем названия полей
sed -i.bak -e '1d' $QUEUE_FILE

let count=1
let file_count=1

cat $QUEUE_FILE | while read line
do
echo $line >> $TMP_FREFIX/$file_count
let count+=1
if [ $count -eq 10 ]; then
pinger.sh $TMP_FREFIX/$file_count > /dev/null &
let count=1
let file_count+=1
fi
done


 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cat pinger.sh 
#!/bin/bash

PING_OPTIONS="-c 1 -w 4"

FILE=$1

OUT_FILE='/tmp/result'

cat $FILE | while read line
do
let alive=`echo $line | awk '{print $3}'`
id=`echo $line | awk '{print $1}'`
ip=`echo $line | awk '{print $2}'`
ping $PING_OPTIONS $ip
if [ $? -eq 0 -a $alive -eq 0 ]; then
echo "$id $ip 1" >> $OUT_FILE
fi
if [ $? -ne 0 -a $alive -eq 1 ]; then
echo "$id $ip 1" >> $OUT_FILE
fi
done
rm $FILE



Ну и то, что апдейтит базу не интересно смотреть.


Тэги:
+ 1 -
Похожие Поделиться

cppmm 29.05.2012 18:59 #
+ 2 -
где я накосячил (ошибки в скрипте)?

На беглый взгляд всё нормально. Я бы для наглядности, павда, `` заменил бы на $(), но это так, косметика.
чем чревато всё это (может ли повиснуть 100500 процессов в памяти)?

С чего бы? Ведь все дочерние процессы сами завершаются вне зависимости от результата. Проблемы кучи процессов в памяти бывают, если родитель должен детей убивать, но почему-то этого не делает.
как ещё ускориться?

Первое, что бросилось в глаза, это вместо
1
2
3
4
cat $QUEUE_FILE | while read line
do
...
done


сделать
1
2
3
4
while read line 
do
...
done < $QUEUE_FILE

cppmm 29.05.2012 19:01 #
+ 1 -
Собственно аналогичная конструкция в пинговалке.
uscr 29.05.2012 19:21 #
+ 0 -
Замена конструкций с while дала -2 секунды (забыл сказать: указанное время - это среднее после 10 замеров). Спасибо.
uscr 29.05.2012 19:22 #
+ 0 -
Вот ещё вопрос: можно ли ускорить запуск pinger.sh, т.е. убрать часть накладных расходов?
cppmm 29.05.2012 19:28 #
+ 0 -
Я вот сейчас у себя провёл пару тестов ещё. Можно попробовать заменить awk на cut -d ' ' -f. Как раз для pinger'а, где оно трижды вызывается. По моим тестам экономит в среднем три секунды на 10к вызовов.
Сейчас ещё один тест проведу по pinger'у, посмотрим.
uscr 29.05.2012 19:33 #
+ 0 -
Думал об этом. Но там табуляция же. Количество пробелов ненормировано. Это нужно сначала ещё исходный файл стандартизировать...
cppmm 29.05.2012 20:44 #
+ 0 -
Но там табуляция же. Количество пробелов ненормировано.

Угу, об этом я не подумал.
А эксперимент мой дал обратный результат(что удивительно), так что тут не поможет. Пока идей нет, позже ещё подумаю, может появятся мысли.
mealsforall 29.05.2012 21:42 #
+ 1 -
А fping < targets_file считается чистым башем?
cppmm 29.05.2012 21:51 #
+ 0 -
Ух ты класс какой. Спасибо, я лично не знал про такую утилиту.
mealsforall 29.05.2012 21:57 #
+ 0 -
Вместо
let alive=`echo $line | awk '{print $3}'`
id=`echo $line | awk '{print $1}'`
ip=`echo $line | awk '{print $2}'`

Сделать

1
2
3
4
set -- $line
id=$1
ip=$2
alive=$3



Можно даже не присваивать, а прям так и манипулировать, $1, $2, $3.
mealsforall 29.05.2012 22:04 #
+ 0 -
А ещё можно не делать sed в самом первом файле, а просто сказать mysql не печатать названия колонок:

mealsforall 29.05.2012 22:05 #
+ 0 -
Кто сожрал параметр команды??

1
--disable-column-names

imraro 07.06.2012 12:25 #
+ 0 -
Почему бы не использовать nmap?

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн