Execução temporizada de programas

Publicado por Andre Miguel (última atualização em 01/09/2009)

[ Hits: 6.039 ]

Download megatruss.sh




Tive uma situação em que precisava rodar um programa similar ao strace do Linux num Solaris - o aplicativo truss - para coletar dados de execução de uma aplicação da empresa.

A aplicação envolve dezenas de processos simultâneos e que geram milhares de informações por segundo, sendo controlados por três processos principais. Estes processos principais não geram tantas informações por segundo como os outros, então o truss ficaria rodando interminavelmente até que eu fizesse um SIGINT ou SIGKILL.

Criei um script em BASH, mesclado com pequenos códigos AWK, para que a execução capturasse determinada quantidade de informações e terminasse, ou que terminasse após um determinado tempo, independentemente da quantidade de informações coletada.

Usei o nawk porque o gawk não tenho disponível nos servidores SUN.

  



Esconder código-fonte

###################
# COMENTARIOS BASICOS
#
# VARIAVEIS
#  srv: servidor logico em execucao no servidor fisico. parametro passado via argumento $1
#  .. da linha de comando
#  d_RES: diretorio de saida dos arquivos coletados
#  f_PROCS: padrao de nome de arquivo de listagem de processos para conferencia
#
# EXECUCAO
#  executa o truss (ou strace, no caso do Linux) numa subsessao do bash via '()'
#
#!/bin/bash
 
timestamp=`date +%Y%m%d%H%M%S`;
d_RES=/tmp/APP_truss.out;
srv=$1;
f_PROCS=APP--procs_$srv.$timestamp;
 
test -z $1 && echo ".::ERR: Execucao: $0 {SERVIDOR LOGICO}" && exit 1;
if [ ! -d $d_RES ]; then
  mkdir $d_RES || echo ".::ERR: Diretorio $d_RES nao existe e nao pode ser criado" && exit -1;
elif [ ! -w $d_RES ]; then
  echo ".::ERR: Diretorio $d_RES nao pode ser escrito";
  exit -1;
fi

###
# REMOVE ARQUIVOS TEMPORARIO DE INDEXACAO 
rm -f $d_RES/.tmp $d_RES/.pids || echo ".::ERR: Impossivel remover arquivos $d_RES/.tmp $d_RES/.pids";
 
for i in `/usr/ucb/ps -auxwww |grep APP |grep $srv |sort +11 |awk '{print $2}'`; do
  /usr/ucb/ps -auxwww |nawk -v i=$i -v d_RES_tmp=$d_RES/.tmp '
{
 if ($2==i){
  print $0"\n"$2,$13;
  print $2,$13 >>d_RES_tmp;
 }
}
' >>$d_RES/$f_PROCS;
  prstat -p $i 1 1 |grep -v ^$ >>$d_RES/$f_PROCS;
  echo >>$d_RES/$f_PROCS;
done
 
test -r $d_RES/.tmp || exit -4;
 
cat $d_RES/.tmp |while read col1 col2; do
  (truss -failedD -t all -v all -x all -r all -w all -u all -p $col1 2>&1 |head -40000 >$d_RES/APP--truss_${srv}_p$col1-$col2.$timestamp.out) &
  echo $! >> $d_RES/.pids;
 
done

###
# TEMPORIZACAO PARA AGUARDAR TERMINO REGULAR 
sleep 360;

###
# FAZ KILL DOS PROCESSOS RESTANTES
for i in `cat $d_RES/.pids`; do
  ps -ef |grep -w $i |grep -v grep;
done |sort -n +1 |grep -w truss |awk '{print $2}' |xargs -i kill -9 {}
 
exit 0;

Scripts recomendados

Backup, restore e leitura de log com Dialog

Instalador .tar.bz2 com menu gráfico Zenity

SCRIPT TESTE DE UPAR

Alta disponibilidade de Links com CentOS 6

Cluster multi-master com MariaDB 10.1 + Galera


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts