Execução temporizada de programas
Publicado por Andre Miguel (última atualização em 01/09/2009)
[ Hits: 6.383 ]
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;
Gerenciamento com firewalld no CentOS 7
Desligar máquinas virtuais Xen
Select DATAFILES especificando uma Tablespace
Cria relatorio de email enviados e recebidos
Gerenciador de Usuários com dialog (Active Directory + Dialog)
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
É normal não gostar de KDE? (15)
Erro ao instalar programa, "você tem pacotes retidos quebrados&qu... (13)









