Como criar script para monitorar mensagens no syslog [RESOLVIDO]

1. Como criar script para monitorar mensagens no syslog [RESOLVIDO]

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 15/10/2016 - 22:50h

Pessoal, acompanho há muito tempo este maravilhoso fórum, o qual já me ajudou em incontáveis ocasiões, visto que tudo que aprendi a respeito de linux foi com muita pesquisa. Eu utilizo o Raspbian (Debian adaptado para Raspberry Pi) e estou com dificuldade para criar um script que deve fazer o seguinte:

1) Rodar em tempo real todos os dias, entre 18h e 03:59h do dia seguinte. Se eu configurar no CRONTAB a sequência * 00,01,02,03,18,19,20,21,22,23 * * * root /caminho/script.sh este script rodará como especificado? Acredito que desta forma ele somente rodará na hora "cheia". Aqui também eu poderia incluir comandos de START e STOP no script, pois aí eu agendaria um horário para início e um para término no CRONTAB.

2) Enquanto o script estiver ativo, deve monitorar o syslog em tempo real pela mensagem (somente novas): Power is back. UPS running on mains.

3) Se esta mensagem aparecer no syslog,o script deve executar (se ativo): curl http://ip-de-destino:porta/code/Luz-Fora-ON

Este script é para monitorar um sistema de iluminação acionado por automação que, no caso de queda de energia, as lâmpadas apagam e não voltam a acender quando a energia é restabelecida. Quem fará o reacendimento é o comando curl http://ip-de-destino:porta/code/Luz-Fora-ON quando o no-break que alimenta o Raspberry Pi detectar o retorno da energia elétrica. Alguém poderia me dar uma luz de como montar este script? Agradeço desde já!


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 18/10/2016 - 19:26h

moacir_79 escreveu:

Olá novamente caro Marcelo. Eu chamei este script de reacende.sh. Testei seus dois scripts, porém ambos estão apresentando erro na linha do comando CHECA_HORA. No primeiro, esta linha é a 8 e no segundo é a 9. O erro apresentado é (no caso do segundo script):

reacende.sh: 9: reacende.sh: Syntax error: "(" unexpected (expecting "}").

Também tenho algumas dúvidas:

1) No comando sleep o tempo não deve ser especificado em segundos?
Ou seja, ao invés de NS="1" não deveria ser NS="60"?

2) Onde neste script eu poderia inserir o comando done > /dev/null 2>&1, para fazer este script rodar em background?

3) Você poderia me explicar como funciona a sintaxe (1[89]|[02][0-3]), para que eu possa alterar os horários posteriormente caso necessário?
Desculpe importuná-lo tanto, mas é que sou muito "verde" em shell script.
Muito obrigado pela ajuda!

=======================================
Boa noite, Moacir.
Aqui não acusa ERRO!!!
Verifique se, na cópia, não faltou a "}" dessa linha.
Qual o "BASH", para saber: echo $BASH
Como é executado o scrip?
"Chame-o" do seguinte modo:
./reacende.sh (PONTOBARRANOMEDOSCRIPT) 

Teste a FUNÇÃO no terminal:
Cole o código abaixo no terminal. [ENTER]
CHECA_HORA() { sleep 1; [[ $(date +%H) =~ ^(1[89]|[02][0-3])$ ]] && echo "CASOU" || { printf "\r CHECANDO => $(date +%H:%M:%S)";CHECA_HORA ; }; } 

Depois, chame a função:
CHECA_HORA [ENTER]
Se, no horário especificado escreve CASOU, SENÃO escreve CHECANDO=> HH:MM:SS , até chegar na HORA
especificada.
======================================================
COMO FUNCIONA (LóGICA)
CHECA_HORA => Já explicado
A FUNÇÃO "SINC" de SINCRONISMO, aguarda no Máximo 1 minuto,
qdo é FINALIZADO o minuto (59 segundos), encerra o LAÇO (while)e
chama a FUNÇÃO CHECA_LOG
CHECA_LOG => "PROCURA" em "/var/log/apcupsd.events",
pela STRING: "${DH}:${MN}:[0-9]+ \-[0-9]+ $MSG"
Onde:
MSG="Power is back. UPS running on mains."
DH=$(date +"%Y-%m-%d %H:")
MN=$(date -d'-1 minute' +%M) #MINUTO ANTERIOR

======================================================
Vamos aos pontos:

1) Não Necessariamente. Pode se especificar: "s", "m", "h" ou dias. O DEFAUT e "s".
No caso, foi especificado 1 segundo mesmo".
Se ALTERAR, pode dar MERD_.

2) NÃO É PARA INSERIR NO SCRIPT!
Chame-o no terminal, assim:
./reacende.sh & 2>&1 /dev/null 



3) A REGEX (1[89]|[02][0-3])
CASA a Hora de 18 as 03:59.
Veja por partes . . .
1[89] => 18 e 19 => Combina 1 com 8 e 1 com 9
[02][0-3] => 00, 01, 02, 03, 20, 21, 22, 23 => combina [0 e 2] com [0 1 2 3]

É isso...

Att.:
Marcelo Oliver




3. Re: Como criar script para monitorar mensagens no syslog

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/10/2016 - 01:47h

moacir_79 escreveu:

Pessoal, acompanho há muito tempo este maravilhoso fórum, o qual já me ajudou em incontáveis ocasiões, visto que tudo que aprendi a respeito de linux foi com muita pesquisa. Eu utilizo o Raspbian (Debian adaptado para Raspberry Pi) e estou com dificuldade para criar um script que deve fazer o seguinte:

1) Rodar em tempo real todos os dias, entre 18h e 03:59h do dia seguinte. Se eu configurar no CRONTAB a sequência * 00,01,02,03,18,19,20,21,22,23 * * * root /caminho/script.sh este script rodará como especificado? Acredito que desta forma ele somente rodará na hora "cheia". Aqui também eu poderia incluir comandos de START e STOP no script, pois aí eu agendaria um horário para início e um para término no CRONTAB.

2) Enquanto o script estiver ativo, deve monitorar o syslog em tempo real pela mensagem (somente novas): Power is back. UPS running on mains.

3) Se esta mensagem aparecer no syslog,o script deve executar (se ativo): curl http://ip-de-destino:porta/code/Luz-Fora-ON

Este script é para monitorar um sistema de iluminação acionado por automação que, no caso de queda de energia, as lâmpadas apagam e não voltam a acender quando a energia é restabelecida. Quem fará o reacendimento é o comando curl http://ip-de-destino:porta/code/Luz-Fora-ON quando o no-break que alimenta o Raspberry Pi detectar o retorno da energia elétrica. Alguém poderia me dar uma luz de como montar este script? Agradeço desde já!

======================================================================
Boa noite Moacir.
Confirme se a linha completa da mensagem é nesse formato.
2016-10-14 09:39:35 -0200 Power is back. UPS running on mains.
E o arquivo é:
/var/log/apcupsd.events

No aguardo,
marcelo oliver




4. Re: Como criar script para monitorar mensagens no syslog [RESOLVIDO]

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 16/10/2016 - 11:46h

msoliver escreveu:

Boa noite Moacir.
Confirme se a linha completa da mensagem é nesse formato.
2016-10-14 09:39:35 -0200 Power is back. UPS running on mains.
E o arquivo é:
/var/log/messages

No aguardo,
marcelo oliver



Olá caro Marcelo e muito obrigado pelo seu retorno! Segue o solicitado:

1) Formato da mensagem (extraída uma linha do arquivo real): Oct 15 07:12:34 RASPBERRY-PI-2 apcupsd[411]: Power is back. UPS running on mains.

2) Arquivo de log: /var/log/syslog

Também há o log exclusivo do daemon apcupsd, que é quem gera este evento no syslog:

1) Formato: 2016-10-15 07:12:34 -0300 Power is back. UPS running on mains.

2) Arquivo de log do daemon: /var/log/apcupsd.events

Acredito que fazer o script analisar somente o log do daemon seja melhor, pois ele terá bem menos mensagens para ler e ocupará menor processamento. Obrigado mais uma vez!



5. Re: Como criar script para monitorar mensagens no syslog [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/10/2016 - 12:29h

moacir_79 escreveu:

msoliver escreveu:

Boa noite Moacir.
Confirme se a linha completa da mensagem é nesse formato.
2016-10-14 09:39:35 -0200 Power is back. UPS running on mains.
E o arquivo é:
/var/log/messages

No aguardo,
marcelo oliver



Olá caro Marcelo e muito obrigado pelo seu retorno! Segue o solicitado:

1) Formato da mensagem (extraída uma linha do arquivo real): Oct 15 07:12:34 RASPBERRY-PI-2 apcupsd[411]: Power is back. UPS running on mains.

2) Arquivo de log: /var/log/syslog

Também há o log exclusivo do daemon apcupsd, que é quem gera este evento no syslog:

1) Formato: 2016-10-15 07:12:34 -0300 Power is back. UPS running on mains.

2) Arquivo de log do daemon: /var/log/apcupsd.events

Acredito que fazer o script analisar somente o log do daemon seja melhor, pois ele terá bem menos mensagens para ler e ocupará menor processamento. Obrigado mais uma vez!

=====================================================
Boa tarde Moacir.
Vamos aos pontos:
1º Ao invés do CRONTAB, deixar o script "rodando" constantemente, analisar o log no horário pretendido, com um "INTERVALO" previamente definido.
Qual seria esse INTERVALO? 01 minuto?
2º Analisar de /var/log/apcupsd.events
Esta de acordo?

No aguardo
Marcelo Oliver





6. Re: Como criar script para monitorar mensagens no syslog

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 16/10/2016 - 12:33h



Boa tarde Moacir.
Vamos aos pontos:
1º Ao invés do CRONTAB, deixar o script "rodando" constantemente, analisar o log no horário pretendido, com um "INTERVALO" previamente definido.
Qual seria esse INTERVALO? 01 minuto?
2º Analisar de /var/log/apcupsd.events
Esta de acordo?

No aguardo
Marcelo Oliver




Boa tarde Marcelo. Perfeito, pode ser desta forma. Depois eu analiso o script para ver onde eu teria que mudar, no caso de alteração de horários e tempo de "scan".


7. Re: Como criar script para monitorar mensagens no syslog

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/10/2016 - 16:33h

moacir_79 escreveu:
Boa tarde Marcelo. Perfeito, pode ser desta forma. Depois eu analiso o script para ver onde eu teria que mudar, no caso de alteração de horários e tempo de "scan".

Moacir, de uma verificada ....
Estou na correria, de saída . . .

#!/bin/bash
ARQ="/var/log/apcupsd.events"
MSG="Power is back. UPS running on mains."
NS="1"

CHECA_HORA() {
sleep $NS
[[ $(date +%H) =~ ^(1[89]|[02][0-3])$ ]] && SINC || { echo "CHECANDO => $(date +%H:%M:%S)";CHECA_HORA ; } # mensagem pode ser retirada
}

SINC() {
sleep $NS
(( ((10#$(date +%S)))>01)) && { echo "SINCRONIZANDO::$(date +%H:%M:%S:%N)";SINC; } || CHECA_LOG
}

CHECA_LOG() {
DH=$(date +"%Y-%m-%d %H:")
MN=$(date -d'-1 minute' +%M)
if egrep "${DH}:${MN}:[0-9]+ \-[0-9]+ $MSG" $ARQ;then
curl http://ip-de-destino:porta/code/Luz-Fora-ON
fi
CHECA_HORA
}
CHECA_HORA

Se a resposta foi ESCLARECEDORA, MARQUE-A como A MELHOR,
Dessa forma, ganho uns pontos no fórum . . .


Att.:
Marcelo Oliver


8. Re: Como criar script para monitorar mensagens no syslog [RESOLVIDO]

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 17/10/2016 - 14:04h

Obrigado Marcelo! Vou fazer meus testes aqui e lhe retorno. Muito obrigado mesmo!!!


9. Re: Como criar script para monitorar mensagens no syslog

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 18/10/2016 - 13:12h

moacir_79 escreveu:

Obrigado Marcelo! Vou fazer meus testes aqui e lhe retorno. Muito obrigado mesmo!!!

===========================================================================
Boa tarde Moacir.
A FUNÇãO "SINC" foi alterada para torná-la mais "EFICIENTE/RáPIDA", segue:


#!/bin/bash

ARQ="/var/log/apcupsd.events"
MSG="Power is back. UPS running on mains."
NS="1"

CHECA_HORA() {
sleep $NS
[[ $(date +%H) =~ ^(1[89]|[02][0-3])$ ]] && SINC || { printf "\r CHECANDO => $(date +%H:%M:%S)";CHECA_HORA ; }
}

SINC() {
while (( ((10#$(date +%S)))>01));do
printf "\r INI_SINC: $(date +%H:%M:%S:%3N)"
done
printf "\n FIM_SINC: $(date +%H:%M:%S:%3N)\n"
CHECA_LOG
}

CHECA_LOG() {
DH=$(date +"%Y-%m-%d %H:")
MN=$(date -d'-1 minute' +%M)
if egrep "${DH}:${MN}:[0-9]+ \-[0-9]+ $MSG" $ARQ;then
curl http://ip-de-destino:porta/code/Luz-Fora-ON
fi
CHECA_HORA
}
CHECA_HORA


Marcelo Oliver




10. Re: Como criar script para monitorar mensagens no syslog [RESOLVIDO]

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 18/10/2016 - 17:56h

Olá novamente caro Marcelo. Eu chamei este script de reacende.sh. Testei seus dois scripts, porém ambos estão apresentando erro na linha do comando CHECA_HORA. No primeiro, esta linha é a 8 e no segundo é a 9. O erro apresentado é (no caso do segundo script):

reacende.sh: 9: reacende.sh: Syntax error: "(" unexpected (expecting "}").

Também tenho algumas dúvidas:

1) No comando sleep o tempo não deve ser especificado em segundos? Ou seja, ao invés de NS="1" não deveria ser NS="60"?

2) Onde neste script eu poderia inserir o comando done > /dev/null 2>&1, para fazer este script rodar em background?

3) Você poderia me explicar como funciona a sintaxe (1[89]|[02][0-3]), para que eu possa alterar os horários posteriormente caso necessário?

Desculpe importuná-lo tanto, mas é que sou muito "verde" em shell script.

Muito obrigado pela ajuda!


11. Re: Como criar script para monitorar mensagens no syslog

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 18/10/2016 - 20:47h

Marcelo, o "BASH" aqui é o /bin/bash. Eu estava chamando o script no formato sh reacende.sh, por isso acusava o erro. Chamando como ./reacende.sh ele executa (fica correndo o "SYNC" e checando o log a cada minuto). O teste da função CHECA_HORA também funcionou corretamente. Nossa, com suas explicações, eu vi que tenho MUUUUUITO que aprender sobre shell script ainda... Quando tentei executar ele em background com o comando ./reacende.sh & 2>&1 /dev/null, recebo a mensagem [1] 10880 -bash: /dev/null: Permissão negada, porém o script roda normalmente em background, porém inserindo suas mensagens na tela. Uma última dúvida de novato: na função CHECA_LOG do segundo script, os 3 "#" que aparecem não estão comentando estas linhas?


12. Re: Como criar script para monitorar mensagens no syslog [RESOLVIDO]

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 18/10/2016 - 23:02h

moacir_79 escreveu:

Uma última dúvida de novato: na função CHECA_LOG do segundo script, os 3 "#" que aparecem não estão comentando estas linhas?


Perdão Marcelo, depois que vi aqui que eu mesmo inseri esses "#" para testar o script aqui... Falha de iniciante... rs

Muito obrigado pela força!!! Estou sempre visitando este fórum e sempre ajudarei também quando meu pequeno grau de conhecimento permitir!





01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts