APLICAR RESULTADO NO MESMO ARQUIVO

1. APLICAR RESULTADO NO MESMO ARQUIVO

Andryos
andryosribeiro

(usa Red Hat)

Enviado em 14/09/2022 - 10:16h

Olá pessoal,

Tenho um shell script que faz a coleta de vários dados do MySQL e leva para um log minuto a minuto.

Atualmente ele gera um arquivo a cada execução, mas minha intenção é que na coleta de 10 min ele gere apenas um arquivo.

Exemplo: execução 1 às 09h00 gerou o arquivo teste.log
execução 2 às 09h01 coletou os dados e levou ao mesmo arquivo teste.log
...
...
execução 11 às 09h11 gerou um novo arquivo teste2.log

Para vocês terem noção, o meu shell está assim:

# Variaveis --------------------------------------------------------------------------------------------------------------

SCRIPT_DIR=/root/bin/mymon
DATA=`date +%Y%m%d.%H%M`
LOG1=${SCRIPT_DIR}/result/act/mymon-$'{D A T A}'.out
LOG2=${SCRIPT_DIR}/result/conn/mymon-$'{D A T A}'.out
LOG3=${SCRIPT_DIR}/result/explain/mymon-$'{D A T A}'.out
LOG4=${SCRIPT_DIR}/result/lock/mymon-$'{D A T A}'.out
LOG5=${SCRIPT_DIR}/result/repl/mymon-$'{D A T A}'.out
LOG6=${SCRIPT_DIR}/result/toptbs/mymon-$'{D A T A}'.out
LOG7=${SCRIPT_DIR}/result/infobuffer/mymon-$'{D A T A}'.out

VER=$($sql -s -N -e "select left (version(), 3) from dual;" 2>/dev/null)

if [[ (( $VER > 5.5 )) ]]

then

echo "=================================================================" >> ${LOG4} 2>> ${LOG4}
echo "- Blocker" >> ${LOG4} 2>> ${LOG4}
echo "=================================================================" >> ${LOG4} 2>> ${LOG4}

$sql -t -e "SELECT
sp.user as blocker_user,
sp.host as blocker_host,
sp.db,
si.blocking_pid as blocker_id,
si.blocking_trx_started as blocker_started,
si.blocking_query as blocker_query,
p.command as blocker_command,
p.state as blocker_state,
sp.info as blocker_info
from sys.innodb_lock_waits as si
INNER JOIN information_schema.processlist as p
on p.id = si.blocking_pid
INNER JOIN information_schema.processlist as sp
on sp.id = si.blocking_pid;" >> ${LOG4} 2>> ${LOG4} 2>/dev/null

echo "=================================================================" >> ${LOG4} 2>> ${LOG4}
echo "- Blocked" >> ${LOG4} 2>> ${LOG4}
echo "=================================================================" >> ${LOG4} 2>> ${LOG4}

$sql -t -e "SELECT
p.user as blocked_user,
p.host as blocked_host,
p.db,
si.waiting_pid as blocked_id,
si.waiting_trx_started as blocked_started,
si.waiting_query as blocked_query,
p.command,
si.locked_table as blocked_db_table,
si.locked_index as blocked_index,
timestampdiff(SECOND, si.waiting_trx_started, sysdate()) as wait_seconds
from sys.innodb_lock_waits as si
INNER JOIN information_schema.processlist as p
on p.id = si.blocking_pid;" >> ${LOG4} 2>> ${LOG4} 2>/dev/null


Acima podemos ver que o resultado é encaminhado ao LOG4, mas gostaria que fosse gerado 1 arquivo apenas com a informação das 09h às 09h10 por exemplo. Alguém saberia me ajudar?


  


2. Re: APLICAR RESULTADO NO MESMO ARQUIVO

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 14/09/2022 - 14:05h

O comando abaixo pega a qde de segundos desde 1970-01-01 00:00:00 UTC, divide por 60 para transformar em minutos e depois faz modulo 10 do resultado. A cada dez minutos a variavel deve mudar o valor. Vc pode definir o nome do arquivo dessa forma, ja que o codigo faz "append"

ARQ=$(expr $(expr $(date +%s) / 60) % 10)

eu faria date +%Y%m%d.%H em vez de date +%Y%m%d.%H%M


3. Re: APLICAR RESULTADO NO MESMO ARQUIVO

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/09/2022 - 14:38h


andryosribeiro escreveu:

Olá pessoal,

Tenho um shell script que faz a coleta de vários dados do MySQL e leva para um log minuto a minuto.

Atualmente ele gera um arquivo a cada execução, mas minha intenção é que na coleta de 10 min ele gere apenas um arquivo.

Exemplo: execução 1 às 09h00 gerou o arquivo teste.log
execução 2 às 09h01 coletou os dados e levou ao mesmo arquivo teste.log
...
...
execução 11 às 09h11 gerou um novo arquivo teste2.log

Para vocês terem noção, o meu shell está assim:

# Variaveis --------------------------------------------------------------------------------------------------------------

SCRIPT_DIR=/root/bin/mymon
DATA=`date +%Y%m%d.%H%M`
LOG1=${SCRIPT_DIR}/result/act/mymon-$'{D A T A}'.out
LOG2=${SCRIPT_DIR}/result/conn/mymon-$'{D A T A}'.out
LOG3=${SCRIPT_DIR}/result/explain/mymon-$'{D A T A}'.out
LOG4=${SCRIPT_DIR}/result/lock/mymon-$'{D A T A}'.out
LOG5=${SCRIPT_DIR}/result/repl/mymon-$'{D A T A}'.out
LOG6=${SCRIPT_DIR}/result/toptbs/mymon-$'{D A T A}'.out
LOG7=${SCRIPT_DIR}/result/infobuffer/mymon-$'{D A T A}'.out

VER=$($sql -s -N -e "select left (version(), 3) from dual;" 2>/dev/null)

if [[ (( $VER > 5.5 )) ]]

then

echo "=================================================================" >> ${LOG4} 2>> ${LOG4}
echo "- Blocker" >> ${LOG4} 2>> ${LOG4}
echo "=================================================================" >> ${LOG4} 2>> ${LOG4}

$sql -t -e "SELECT
sp.user as blocker_user,
sp.host as blocker_host,
sp.db,
si.blocking_pid as blocker_id,
si.blocking_trx_started as blocker_started,
si.blocking_query as blocker_query,
p.command as blocker_command,
p.state as blocker_state,
sp.info as blocker_info
from sys.innodb_lock_waits as si
INNER JOIN information_schema.processlist as p
on p.id = si.blocking_pid
INNER JOIN information_schema.processlist as sp
on sp.id = si.blocking_pid;" >> ${LOG4} 2>> ${LOG4} 2>/dev/null

echo "=================================================================" >> ${LOG4} 2>> ${LOG4}
echo "- Blocked" >> ${LOG4} 2>> ${LOG4}
echo "=================================================================" >> ${LOG4} 2>> ${LOG4}

$sql -t -e "SELECT
p.user as blocked_user,
p.host as blocked_host,
p.db,
si.waiting_pid as blocked_id,
si.waiting_trx_started as blocked_started,
si.waiting_query as blocked_query,
p.command,
si.locked_table as blocked_db_table,
si.locked_index as blocked_index,
timestampdiff(SECOND, si.waiting_trx_started, sysdate()) as wait_seconds
from sys.innodb_lock_waits as si
INNER JOIN information_schema.processlist as p
on p.id = si.blocking_pid;" >> ${LOG4} 2>> ${LOG4} 2>/dev/null


Acima podemos ver que o resultado é encaminhado ao LOG4, mas gostaria que fosse gerado 1 arquivo apenas com a informação das 09h às 09h10 por exemplo. Alguém saberia me ajudar?

Boa tarde andryosribeiro.
Segue sugestão para o nome do arquivo de log:
printf "LOG_%(%Y%m%d_%H)T0$(($(printf "%(%-M)T")/10)).out\n"
LOG_20220914_1403.out
LOG=$(printf "LOG_%(%Y%m%d_%H)T0$(($(printf "%(%-M)T")/10)).out")

Para cada "hora", são gerados 06 arquivos, com base no minuto /10.
for ((m=0;m<60;m++)) { printf "14:%02d\n" $((m/10));}|sort -u
14:00
14:01
14:02
14:03
14:04
14:05


______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



4. Re: APLICAR RESULTADO NO MESMO ARQUIVO

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/09/2022 - 18:34h


leandropscardua escreveu:

O comando abaixo pega a qde de segundos desde 1970-01-01 00:00:00 UTC, divide por 60 para transformar em minutos e depois faz modulo 10 do resultado. A cada dez minutos a variavel deve mudar o valor. Vc pode definir o nome do arquivo dessa forma, ja que o codigo faz "append"

ARQ=$(expr $(expr $(date +%s) / 60) % 10)

eu faria date +%Y%m%d.%H em vez de date +%Y%m%d.%H%M

Leandro, boa noite.
Reveja a solução proposta.....


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



5. Re: APLICAR RESULTADO NO MESMO ARQUIVO

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 15/09/2022 - 22:35h

msoliver escreveu:


leandropscardua escreveu:

O comando abaixo pega a qde de segundos desde 1970-01-01 00:00:00 UTC, divide por 60 para transformar em minutos e depois faz modulo 10 do resultado. A cada dez minutos a variavel deve mudar o valor. Vc pode definir o nome do arquivo dessa forma, ja que o codigo faz "append"

ARQ=$(expr $(expr $(date +%s) / 60) % 10)

eu faria date +%Y%m%d.%H em vez de date +%Y%m%d.%H%M

Leandro, boa noite.
Reveja a solução proposta.....


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________

Sim, tem um erro. Acho que vai distribuir os logs em vez de cortar . Vou dar uma melhorada.
[editado]Talvez a operação deva ser divisão inteira e não modular. Qdo estiver no computador vou dar uma olhada.



6. Re: APLICAR RESULTADO NO MESMO ARQUIVO

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/09/2022 - 05:52h

Assumindo que o shell usado seja o bash, eis minha sugestão, que tem semelhanças com a sugestão do msoliver, mas não recorre a subprocessos nem redirecionamentos.
# Pega a hora corrente em formato time_t (segundos desde 1970/01/01 00:00:00 UTC) e grava na variável “now”.
printf -v now "%(%s)T" -1

# Agora usa o valor de “now” para gerar o nome do arquivo, arrendondando o timestamp para um múltiplo de dez minutos.
print -v filename "arquivo_%(%Y%m%d%H%M)T" $((now/600*600))



Cada vez que se usa uma construção do tipo $(comando) ou `comando` num script provoca-se a criação de um novo pipe, um novo processo e um novo redirecionamento da saída padrão para o pipe, além de todo um fluxo adicional de tratamento de ciclo de vida desses processos e descritores de arquivos. Podendo-se evitar essas construções, por meio da opção -v do printf ou da opção -u de read, por exemplo, é quase sempre um ganho.

Apenas para dar uma ideia da comparação, segue uma comparação da execução da quantidade de chamadas de um trecho que implementa a funcionalidade acima usando atribuição às variáveis usando $(comando) e a opção -v de printf. Note como a primeira gera mais chamadas ao SO (250) do que a segunda (142), e como o número de chamadas referentes a criação e encerramento de processos e redirecionamento para o pipe só ocorre na versão com $(comando), e nenhuma vez na versão com escrita direta nas variáveis.
$ strace -f -s 1024 -o /tmp/lixolixo bash -c 'now=$(printf "%(%s)T" -1); latest_ts=$(printf "%(%Y%m%d-%H%M)T" $((now/600*600))); echo $latest_ts'; wc /tmp/lixolixo; egrep "\b(clone|v?fork|dup[23]?|pipe2?|wait(4|pid|id)?)\b" /tmp/lixolixo | wc -l
20220916-0540
250 2033 37424 /tmp/lixolixo
10

$ strace -f -s 1024 -o /tmp/lixo bash -c 'printf -v now "%(%s)T" -1; printf -v latest_ts "%(%Y%m%d-%H%M)T" $((now/600*600)); echo $latest_ts'; wc /tmp/lixo; egrep "\b(clone|v?fork|dup[23]?|pipe2?|wait(4|pid|id)?)\b" /tmp/lixo | wc -l
20220916-0540
142 1141 23327 /tmp/lixo
0



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


7. Re: APLICAR RESULTADO NO MESMO ARQUIVO

Xerxes
xerxeslins

(usa openSUSE)

Enviado em 16/09/2022 - 11:49h


andryosribeiro escreveu:

Olá pessoal,

Tenho um shell script que faz a coleta de vários dados do MySQL e leva para um log minuto a minuto.

Atualmente ele gera um arquivo a cada execução, mas minha intenção é que na coleta de 10 min ele gere apenas um arquivo.

Exemplo: execução 1 às 09h00 gerou o arquivo teste.log
execução 2 às 09h01 coletou os dados e levou ao mesmo arquivo teste.log
...
...
execução 11 às 09h11 gerou um novo arquivo teste2.log

[...]

mas gostaria que fosse gerado 1 arquivo apenas com a informação das 09h às 09h10 por exemplo. Alguém saberia me ajudar?


Veja se isto ajuda:

N=1
while true; do
echo "teste ok" >> log$N.txt
if [ `date +%M` -eq 10 ]; then
N=$((N+1))
fi
sleep 60
done

Este código cria um loop infinito que imprime a string "teste ok" em um arquivo chamado logN.txt, e espera 1 minuto para repetir. Porém, se a data atual for 10 minutos, ele incrementa o número N.

Se seu script for convertido em uma função, talvbez possa adaptar para executar a função nesse loop.


--
Chega uma hora na vida que você só quer bater o prego e não perder tempo estudando a ciência da construção de um martelo.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts