Natrio
Для сравнения строк есть специальные операции проверки, встроенные в баш.

Если пользоваться регулярными выражениями, это можно сделать так:
if [[ $n =~ connection$ ]] ; then SLC
elif [[ $n =~ disconnected$ ]] ; then SLD
fi
Если по простым маскам, то так:
case "$n" in
*connection) SLC ;;
*disconnected) SLD ;;
esac

спасибо, в очередной раз )

c регулярками тот же объем отработал за 5 секунд, ядро нагрузило до 47 процентов.
тренируюсь вот на кошках

работает
tail -f somelog | while read n do; lalal

#!/bin/bash
SLC () {
logger 'CONNECTION'
}
SLD () {
logger 'DISCONNECTED'
}
tail -f /var/log/asterisk/full | while read n; do
	if [ "`echo $n | grep -o 'connection$'`" = "connection" ]; then SLC && continue
	elif [ "`echo $n | grep -o 'disconnected$'`" = "disconnected" ]; then SLD
	fi;
done

(помню про дескриптор, это пока за рамками)

периодически в лог прилетает 20к строчек (не попадающие под выборку, тоесть чисто операции сравнения). скрипт занимает 10-11 процентов проца, секунд этак на 60 )
можно как то оптимизировать процесс сравнения?
7-8 условий сравнения это процесс удлинят по времени огого.
Natrio
Возможная проблема такой реализации – в случае ротации лога без ведома вашего скрипта, старый лог будет переименован, а новый заново создан, при этом ваш скрипт останется "висеть" на старом, потому что после открытия файла он привязан уже не к имени, а к дескриптору файла, который при переименовании не меняется.

спасибо. учту.
по идее logortate у меня логи крутит, можно на него повестить ответственность по перезапуску парсинга лога.
Добрый день.

Есть астериск на котором летит debug в лог. В день примерно 1.2-2.0 гига.
Надо отлавливать определенные события и делать с ними всякое.

Корректно ли сделать tail -f с проверкой if прилетающих строк на события?

типа tail -f | while read n; do
if [ парсинг строки совпал с error ]; then blabla
elseif [ парсинг строки совпал и тд

Или правильнее ротировать лог каждые пять минут, проверять получившийся кусок и проверять следующий?
да, ошибки валятся

ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.201' (113)

нашел, mysql блаблабл > asterisk.$I.users.txt 2>&1 || echo BOO
И снова добрый день )

Есть в скрипте mysql запрос делающий select

mysql -C --connect-timeout=10 -h$I -u$lgn -p$pswd -e "SELECT extension,name FROM asterisk.users;" > asterisk.$I.users.txt

иногда SQL недоступен и таблицы не получаю.
в этом случае надо сделать всякое, но как получить переменную $? от mysql?

если делаю mysql блаблабл > asterisk.$I.users.txt && echo OK || echo BOO! даже в случае ошибки подключения получаю OK

сейчас проверяю полученный файл на empty отдельной проверкой, но логично было бы получать ошибку и предпринимать действия.
а в чем смысл имено так представлять переменную?

 for I in ${TEMP[*]}
nafanja
zubastiy
к сожалению нет

[[email protected] ~]$ bash -x work/scripts/ping
+ TEMP=('ya.ru' 'google.com')
+ for I in '${TEMP}'
+ ping ya.ru -c 2
PING ya.ru (213.180.204.3) 56(84) bytes of data.
64 bytes from www.yandex.ru (213.180.204.3): icmp_seq=1 ttl=51 time=14.1 ms
64 bytes from www.yandex.ru (213.180.204.3): icmp_seq=2 ttl=51 time=13.5 ms
--- ya.ru ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 13.501/13.848/14.195/0.347 ms

а если
TEMP=('ya.ru' 'google.com')
заменить на
TEMP='ya.ru google.com'
должно работать.

да, так работает, спс.
Natrio
Запускать скрипт через bash -x не нужно, достаточно прописать в начале указатель на баш, и сделать скрипт исполняемым командой chmod 755 скрипт
После этого можно запускать просто ./скрипт
А если положите его в один из путей, указанных в PATH, то просто скрипт

Если в именах хостов нет пробелов и прочих спецсимволов, а насколько я помню, их там быть не должно, можно сделать так:
#!/bin/bash
HOSTS="ya.ru google.com 8.8.8.8"
for i in $HOSTS ; do
 ping -c2 -w2 $i
done
Ключ -w2 нужен, чтобы ping не ждал ответа больше двух секунд, если хост "лежит".

Если список хостов не вводится снаружи и нигде кроме цикла не используется, можно перенести его прямо в цикл:
#!/bin/bash
for i in ya.ru google.com 8.8.8.8 ; do
 ping -c2 -w2 $i
done

да, так работает.

bash -x запускаю чтобы работу скрипта дебажить, там еще много чего происходит и ломается )
мне было важно понять, как передавать переменные в тело цикла, за что вам большое спасибо.
не подставляет второй хост

Опс. не видел предыдущий пост, сейчас почитаю )