Народ, кому не лень, проверьте работает ли у вас на роутере команда
или только у меня вылетает с segmentation fault?Code:echo "qwerty[i]" | /usr/bin/tr '[' ' '
Замечательно... Точнее ничего замечательного нет. Придется теперь скрипты под sed переписывать ((
cyrax, спасибо за информацию.
Вопрос оптимизации.
Имеется роутер WL500GP - самый быстрый в семействе, но далеко не каждое подобное устройство сможет конкурировать с настольным компьютером или ноутбуком в производительности. Поэтому важно "правильно" написать скрипт.
Понимаю что написание скриптов на shell большое искусство. Только знание и опыт могут превратить "километровый" код в "две строки" кода дающие тот же результат.
Первая задача - условно "найти различия".
Привожу пример скрипта (Листинг 1) который находит различия в двух списках и помещает её в файлы. Время выполнения скрипта на роутере WL500GP составляет - 240 секунд.
Скрипт (Листинг 2) выполняет тоже самое, но выполняет это за 2 секунды.Code:Листинг 1. F_DIFF_LIST () { cat /dev/null > $LIST_DEL while read STR_OLD do grep -q $STR_OLD $LIST_NEW if [ $? -eq 1 ] then echo "$STR_OLD" >> $LIST_DEL fi done <$LIST_OLD cat /dev/null > $LIST_ADD while read STR_ADD do grep -q $STR_NEW $LIST_OLD if [ $? -eq 1 ] then echo "$STR_OLD" >> $LIST_DEL fi done <$LIST_NEW }
Используется diff из diffutils - в результате существенная разница!!!
Задача выполнена.
Вторая задача - условно "маршрутизация".Code:Листинг 2. F_DIFF_LIST () { diff -a $LIST_NEW $LIST_OLD | grep ">" | awk '{ print $2 }' > $LIST_ADD diff -a $LIST_NEW $LIST_OLD | grep "<" | awk '{ print $2 }' > $LIST_DEL }
Скрипт (Листинг 3) выполняется 150 секунд - долго!!!
Выполненение задачи???
Подскажите как правильно написать скрипт "Листинг 3" чтобы он выполнялся быстрее.Code:Листинг 3. F_ROUTE_UAIX () { while read IPUAIX do echo "$IPUAIX" | grep -q "/" if [ $? -eq 0 ] then /sbin/route $PARAM -net $IPUAIX gw $GATEWAY else /sbin/route $PARAM -net $IPUAIX/$DEF_MASK gw $GATEWAY fi done <$UALIST }
---
непонятно с какого хобота им выполнятся по две три минуты .
Что на фход то подается ? какие структуры ?
---
Долго потому в файле $UALIST (он же ua-list.txt - прикреплен ниже) список из более чем 1800 сетей.
---
Подробно:
Роутер подключен к кабельному модему. Получает IP от DHCP провайдера №1. Поднимает VPN - провайдер №2. Понимает стену для разруливания трафика соглано списка $UALIST.
Переменные:
$UALIST - список IP адресов сетей входящих в UA-IX (файл ua-list.txt без 4-х верних строк)
$LIST_OLD - IP адреса предыдущего списка маршрутизации (старый $UALIST)
$LIST_NEW - IP адреса для текущего списка маршрутизации (новый $UALIST)
$LIST_DEL - IP адреса удалемые из списка маршрутизации (чтоб не переписывать весь список)
$LIST_ADD - IP адреса добавляемые к списку маршрутизации (чтоб не переписывать весь список)
$PARAM - опция "add" или "del"
$GATEWAY - шлюз провайдера №1 для текущего соединения
$DEF_MASK - маска по умолчанию
Список сетей входящих в UA-IX (файл ua-list.txt) переодически обновляеться (раз в 15 мин.). Количество сетей заметно растёт и за 1 год вырос придлизительно на 600 сетей.
При текущем количестве сетей (>1800) скрипт (Листинг 3) выполняется 150 секунд. При поднятии стены прописываеться полный список, а в последующем только разница. Пока время в 150 секунд - терпимо, а дальше? (список то растёт!!!)
Ести ли варианты прописать таблицу (список) маршрутизации быстрее???
---
А bash пробовали использовать в качестве шелла?
В общем, чтобы было быстро, нужно написать на Си загрузку маршрутов...
Попробуй, может awk быстрее будет обрабатывать. А самое лучшее решение - писать на C.
Code:cat $UALIST | awk -F "/" -v PARAM=$PARAM -v GATEWAY=$GATEWAY -v DEF_MASK=$DEF_MASK ' /^[0-9].*/{ if ($2 != "") { system("/sbin/route " PARAM " -net " $0 " gw " GATEWAY); } else { system("/sbin/route " PARAM " -net " $1 "/" DEF_MASK " gw " GATEWAY); } }'
Last edited by Mam(O)n; 01-06-2007 at 11:22. Reason: очепятка в DEF_MASK. неузрел знак "_"
---
Благодарю.
Обязательно попробую с awk, если не поможет тогда пойду на "бинарный уровень".
---
---Попробуй, может awk быстрее будет обрабатывать.
Код с awk - время выполнения 105 секунд (1829 сетей).
105 с. < 150 с.
Лучше. Позже попробую на Си.
---
Докучи еще можно попробовать накатить перл и попробовать на нем. Может быстрее awk будет.
Вообще в свежих версиях iproute2 команда ip имеет опцию -batch file, позволяющую за один вызов выполнить произвольное количество команд. Но в прошивке сейчас слишком старая версия, которая этого не умеет.
Дано:
Имеется файл, в котором записаны айпишники и названия узлов, например так:
Требуется:88.88.88.88 RABOTA
77.77.77.77 FRIEND
11.11.11.11 CHINEESE_HACKER
Скрипт, который периодически просматривает системный лог и заменяет в нём эти айпишники на указанные названия из файла.
Скрипт планирую запускать через cron.
Если нужно, то структуру файла с названиями можно поменять.
Подскажите как сделать?