Execução temporizada de programas
Publicado por Andre Miguel (última atualização em 01/09/2009)
[ Hits: 6.360 ]
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;
Sincronizar arquivos com rsync
Configurando CISCO por Shell Script
Monitorando espaço em disco com IP dinâmico.
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Problema em SSD ao dar boot LinuxMint LMDE FAYE 64 (0)
Baixar jogos Independentes para Ubuntu [RESOLVIDO] (4)
PIP3 - erro ao instalar módulo do mariadb para o Python (1)
Linux x Plataformas de Trading - um problema (in-)solúvel? (4)