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

Делюсь своим опытом параллельного разбора технологического журнала. По мотивам статьи 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 | \r
perl -n -e 'if (/#k8SjZc9Dxkdd:dd.d+/) {$event =~ s/.
/<line>/g; print $event."
"; $event = "";} $event .= $_; END{print $event};' | \r
perl -pe 's/xefxbbxbf//g' | \r
grep -P "SDBL.*Func=(Commit|Rollback)Transaction.*Context" | \r
perl -pe 's/#k8SjZc9Dxkd+:d+.d+-//g' | \r
perl -pe 's/,SDBL,.*Context.*<line>[ 	]+/,Context=/g' | \r
perl -pe 's/,SDBL,.*Context=/,Context=/g' | \r
sed 's/<line>//g' | \r
awk -F',Context=' '{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {print sum[i] " " sum[i]/count[i] " " count[i] " " i}}' | \r
sort -rnb | \r
head -n 5 > $2/long_transactions.txt
#!/bin/bash
#scr/long_calls.sh
cat $1/events/rphost*/*.log | \r
perl -n -e 'if (/#k8SjZc9Dxkdd:dd.d+/) {$event =~ s/.
/<line>/g; print $event."
"; $event = "";} $event .= $_; END{print $event};' | \r
perl -pe 's/xefxbbxbf//g' | \r
grep -P ",CALL,.*,Context=" | \r
perl -pe 's/<line>//' | \r
perl -pe 's/#k8SjZc9Dxkd+:d+.d+-//g' | \r
perl -pe 's/,CALL,.*Context/,Context/g' | \r
perl -pe 's/,Interface=.*OutBytes=d+//g' | \r
awk -F',Context=' '{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {printf "%d %d %d %s
",sum[i],sum[i]/count[i], count[i],i}}' | \r
sort -rnb | \r
head -n 5 > $2/long_calls.txt

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

 

 

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *