Enviado em 26/07/2015 - 20:20h
Vixe, espero que dê para entender... comecei com shell esses dias.
#!/bin/bash
# Verifica se foi passado os 2 parametros
if [ $# != 2 ]; then
echo "****************************************************************************************"
echo "* Você tem que passar dois parametros. (arquivo com os comando e tempo para cada um)"
echo "* Exemplo... benchmark.sh <arquivo com os comandos> '250000 500000 750000'"
echo "****************************************************************************************"
exit 0
fi
# Verifica se o dataset existe
if [ ! -e $1 ]; then
echo "*********************************************************"
echo " Arquivo $1 não encontrado."
echo "*********************************************************"
exit 0
fi
# Gera um vetor dos parametros passados para o sleep
vetor=(`echo $2`)
# pega o tamanho desse vetor (pode ser um sleep para todos os programas ou um para cada)
tamanho=${#vetor[@]}
cont=0
# Trata cada comando do arquivo passado como parametro separadamente
while read line
do
olddir=`pwd` # Grava o diretorio de onde foi chamado o benchmark
vetor2=(`echo $line`) # Grava em um vetor a linha do arquivo com o comando (programa vai ser o primeiro indice)
basedir=`dirname ${vetor2[0]}` # Pega o diretorio onde estah o programa
eval cd "$basedir" # vai para o diretorio
programa=`basename ${vetor2[0]} "."${vetor2[0]##*.}` # Pega apenas o nome do programa sem extensão
logBench=`echo ${olddir}/log_${programa}_benchmark_$$` # monta nome do arquivo de log do programa
p=`bash -c "$line" &> $logBench & echo $!` # Executa programa e pega seu PID
first=`ps -p $p -oeuser,pid,%cpu,%mem,comm | grep $p` # Faz a primeira leitura
logCompressor=`echo ${olddir}/log_${programa}_benchmark_$$_${p}` # Monta nome do arquivo de log benchmark
echo "Comando utilizado - $line " &> $logCompressor # grava na log
echo "Início em `date +"%d-%m-%Y %H:%M:%S:%N"`" &>> $logCompressor # grava na log
echo "`date +"%d-%m-%Y %H:%M:%S:%N"` -- $first " &>> $logCompressor # grava na log
# Enquanto o processo estiver executando
while kill -0 $p 2> /dev/null; do
snap=`top -n 1 -b -p $p | grep $programa` # faz leitura
d=`date +"%d-%m-%Y %H:%M:%S:%N"` # Pega horário
echo "$d -- $snap " &>> $logCompressor # grava na log
usleep ${vetor[$cont]} # Dorme por x nanosegundos
done
# Informa horario de termino
echo "Termino em `date +"%d-%m-%Y %H:%M:%S:%N"`" &>> $logCompressor
# Se foi passado mais de um sleep, é mudado para o sleep do proximo programa
if [ $tamanho -gt 1 ]; then
(( cont++ ))
fi
# Volta ao diretorio de onde foi chamado o benchmark
eval cd "$olddir"
done <$1
# concatena arquivos gerados
cat log_*_benchmark_$$* > log_benchmark_$$_merged