Execução temporizada de programas
Publicado por Andre Miguel (última atualização em 01/09/2009)
[ Hits: 6.434 ]
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.
###################
# 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;
Altera /etc/fstab colocando o parâmetro acl nas partições ext3.
Repasse de parâmetros de um script a outro
Firewall - Satefull inspection com NAT
Baixando fotos de uma câmera digital pela USB
Bashblog v1.0 0 - cria um microblog em HTML5
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como impedir exclusão de arquivos por outros usuários no (Linux)
Cirurgia no Linux Mint em HD Externo via USB
Anúncio do meu script de Pós-Instalação do Ubuntu
Formas seguras de instalar Debian Sid (2)
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (12)
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (5)
Alguém executou um rm e quase mata a Pixar! (3)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (6)









