bash, еще bash, еще много-много bash

Администрирование - Системное

технологический журнал bash

7
Делюсь своим опытом параллельного разбора технологического журнала. По мотивам статьи https://infostart.ru/public/928184.

Оригинальная публикация была сделана еще год назад. Тогда пришлось вручную запускать 15 скриптов для разбора технологического журнала (около 60 Гб в первые дни). Перспектива делать это каждый день на протяжении двух недель меня не обрадовала. Поэтому решил поизучать мануалы по bash для написания управляющего скрипта. Приятным бонусом стала информация о том, что можно реализовать параллельный запуск. В итоге написал скрипт:

#!/bin/bash
#main.sh - one script to rule them all
#scr/* script_dir
#$1 tech_log_dir
#$2 result_dir

if [ "$1" = "" ] 
then 
echo 'set param tech_log_dir (1)'
exit
fi

tech_log_dir=$1

if [ "$2" = "" ] 
then 
result_dir=$(basename $1)
else
result_dir=$2
fi

if ! [ -d $result_dir ]
then
mkdir $result_dir
fi

for i in scr/*.sh; do $i $tech_log_dir $result_dir & done

Реализованы два варианта запуска:
$ bash main.sh /e/techlog - анализирует данные в каталоге /e/techlog, создает в каталоге скрипта подкаталог techlog и складывает в него результаты разбора
$ bash main.sh /e/techlog /f/result - анализирует данные в каталоге /e/techlog и складывает в /f/result результаты разбора

Рабочие скрипты складываются в подкаталог /scr каталога расположения основного скрипта.

Примеры адаптации скриптов с ИТС под передаваемые параметры и структуру каталогов технологического журнала:

#!/bin/bash
#scr/long_transactions.sh
cat $1/events/rphost*/*.log | \
perl -n -e 'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};' | \
perl -pe 's/\xef\xbb\xbf//g' | \
grep -P "SDBL.*Func=(Commit|Rollback)Transaction.*Context" | \
perl -pe 's/^\d+:\d+.\d+-//g' | \
perl -pe 's/,SDBL,.*Context.*<line>[ \t]+/,Context=/g' | \
perl -pe 's/,SDBL,.*Context=/,Context=/g' | \
sed 's/<line>//g' | \
awk -F',Context=' '{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {print sum[i] " " sum[i]/count[i] " " count[i] " " i}}' | \
sort -rnb | \
head -n 5 > $2/long_transactions.txt
#!/bin/bash
#scr/long_calls.sh
cat $1/events/rphost*/*.log | \
perl -n -e 'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};' | \
perl -pe 's/\xef\xbb\xbf//g' | \
grep -P ",CALL,.*,Context=" | \
perl -pe 's/<line>//' | \
perl -pe 's/^\d+:\d+.\d+-//g' | \
perl -pe 's/,CALL,.*Context/,Context/g' | \
perl -pe 's/,Interface=.*OutBytes=\d+//g' | \
awk -F',Context=' '{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {printf "%d %d %d %s\n",sum[i],sum[i]/count[i], count[i],i}}' | \
sort -rnb | \
head -n 5 > $2/long_calls.txt

Эффект от параллельного выполнения моих пятнадцати скриптов:

 

 

7

См. также

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение