Pular para o conteúdo

Execução temporizada de programas

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.
Andre Miguel uberalles
Hits: 6.545 Categoria: Shell Script Subcategoria: Avançado
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

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.
Download megatruss.sh Enviar nova versão

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;

Instalando e configurando o AIDE em 15 minutos

Trocar string A por string B em vários arquivos

Árvore de Natal do Julio Neves

Conversor de arquivos de vídeo (Video Converter)

Projeto Wine's Faces

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.