Con este SCRIPT monitoreo en linea un archivo LOG, en el cual se controlan los tiempos de ejecución de las distintas fases, contranstandolas contra los tiempos estimados de ejecución de cada una de la fases. Si alguna es excedida en el tiempo de ejecución, el SCRIPT procede a emitir una alerta, la cual puede consistir en enviar un MAIL o grabar la información en un archivo de registro.- Probado en servidor AIX.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
#!/bin/bash pvector=/usr01/home/monitor/shells/p$1vector.txt alerta=/usr01/home/monitor/shells/alerta.txt echo $logvector echo Fase Tiempo H.Inicio H.Fin Utilizado Excedido # leo en forma secuencial el archivo pvector el cual # tiene solo 2 campos : numero de fase y tiempo # de ejecucion while read fase ; do # leo los datso del archivo y se los asigno # a las variables fas=`echo $fase | cut -d " " -f 1` min=`echo $fase | cut -d " " -f 2` seg=`echo "scale=0; $min * 60" | bc` # Busco el patron indicado y capturo la linea # siguiente la cual contiene la fecha y hora # de comienzo de la Fase indicada # Si no enccuentra el PATRON se salta y lee # el siguiente registro del archivo if [ -f /APPADP01/home/vectprod/EXTERNOS_$3/bin/$2 ]; then logvector=/APPADP01/home/vectprod/EXTERNOS_$3/bin/$2 elif [ -f /APPADP01/home/vectprod/EXTERNOS_$3/bin/LOG/$2 ]; then logvector=/APPADP01/home/vectprod/EXTERNOS_$3/bin/LOG/$2 else echo "** ARCHIVO DE LOG *** NO EXISTE *****" read pausa break fi inicio=`cat $logvector | sed -n '/^Fase '$fas'/{n;p;}'` if [ "${inicio:-NULL}" = "NULL" ]; then continue fi hor1=`echo $inicio | cut -d " " -f 4` h11=`echo $hor1 | cut -d ":" -f 1` h12=`echo $hor1 | cut -d ":" -f 2` h13=`echo $hor1 | cut -d ":" -f 3` h14=`echo "$h13 + ($h12 * 60) + ($h11 * 3600)" | bc` h15=`echo "scale=0; $h14 / 60" | bc` bandera=no # Genero un ciclo infinito con el BUCLE FOR en donde # Comienzo a consultar si existe el patron de FIN # de la fase monitoreada - Si no encuentra el patron # Calcula la hora transcurrida y la verifica contra # el tiempo estimado de ejecucion # Si el tiempo es exedido procede a enviar un correo # para tomar las acciones que sean necesarias. for ((;;)); do if [ -f /APLI/home/prod/NOS_$3/bin/$2 ]; then logvector=/APLI/home/prod/NOS_$3/bin/$2 elif [ -f /APLI/home/prod/NOS_$3/bin/LOG/$2 ]; then logvector=/APLI/home/prod/NOS_$3/bin/LOG/$2 else echo "** ARCHIVO DE LOG *** NO EXISTE *****" read pausa break fi final=`cat $logvector | sed -n '/^Fin Fase '$fas'/{n;p;}'` if [ "${final:-NULL}" = "NULL" ]; then hact2=`echo $(date) | cut -d " " -f 4` hora1=`echo $hact2 | cut -d ":" -f 1` hora2=`echo $hact2 | cut -d ":" -f 2` hora3=`echo $hact2 | cut -d ":" -f 3` hora4=`echo "scale=0; $hora3 + ($hora2 * 60) + ($hora1 * 3600)" | bc` hora5=`echo "scale=0; $hora4 / 60" | bc` if [ $hora5 -gt $h15 ]; then tiempo=`echo "scale=0; $hora5 - $h15" | bc` fi if [ $h15 -gt $hora5 ]; then tiempo=`echo "scale=0; ( 1440 - $h15 ) + $hora5" | bc` fi if [ $tiempo -gt $min ]; then difer=`echo "$tiempo - $min" | bc` echo `date +%Y%m%d` `date +%H:%M:%S` $logvector FASE $fas $min $hor1 $tiempo $difer >> $alerta echo "$logvector FASE $fas $min $hor1 $tiempo $difer" | mail -s "ALERTA-VECTOR FASE $fas excedido en $difer MINUTOS" correo@tu.cl fi else bandera=si fi # Aqui consulta la variable "bandera" si su valor # es = a "si" procede a quebrar el bucle infinito # es decir finaliza la fase y debera seguir # con la siguiente if [ $bandera = si ]; then break fi sleep 900 done hor2=`echo $final | cut -d " " -f 4` h21=`echo $hor2 | cut -d ":" -f 1` h22=`echo $hor2 | cut -d ":" -f 2` h23=`echo $hor2 | cut -d ":" -f 3` # Trasnformo la hora a minutos h24=`echo "scale=0; $h23 + ($h22 * 60) + ($h21 * 3600)" | bc` if [ $h24 -gt $h14 ]; then difer=`echo "scale=0; $h24 - $h14" | bc` else difer=`echo "scale=0; (86400 - $h14) + $h24" | bc` fi if [ $h24 -eq $h14 ]; then difer=0 fi minutos=`echo "scale=0; $difer / 60" | bc` resto=`echo "scale=0; $minutos - $min" | bc` bien=1 if [ $resto -lt $bien ]; then resto=0 fi echo $fas $min $hor1 $hor2 $minutos $resto done <<< "`cat $pvector`" |
Estimados , como podría monitorear , cuando un logs no está escribiendo , por medio de un sh y que me mande un corrreo?
Existen muchas formas de realizar, por ejemplo en un SCRIPT infinito, cada cierta cantidad de minutos puede chequear el tamaño, fecha y hora del archivo log. En el próximo chequeo enviaría un correo informando que no esta escribiendo. Otra forma forma en LINUX existe un comando SUM, que también tengo un script en mi pagina. Este entrega un numero que corresponde a la marca del archivo. Al cambiar esta marca también cambia. Tratare de realizar y subir un SCRIPT para esto con diferentes formas de realizarlo… saludos.
Buenas tardes, me gustaria ver si es posible hacer un script de bash que pueda acceder al contenido de un log y buscar un parametro en especifico que se llama f039 y ese parametro siempre tiene el valor 0 que significa un estatus correcto de servicio pero cuando se detone algo diferente de 0 enviar una alerta por correo electronico
Hola Juan, podría ser algo como lo que indico a continuación, aqui supongo que el codigo tiene esta forma f039=[numero]
Lo puedes modificar, en todo caso hare algo similar y lo probare para publicarlo en mi sitio… saludos… espero te sirva
#!/bin/bash
# Nombre del archivo de log que deseas verificar
LOG_FILE=»/ruta/al/archivo.log»
# Buscar las líneas que contienen el parámetro f039=
while read -r linea; do
if [[ «$linea» =~ f039=([0-9]+) ]]; then
valor=»${BASH_REMATCH[1]}»
if [ «$valor» != «0» ]; then
# Dirección de correo electrónico a la que se enviará la notificación
DESTINATARIO=»tu-correo-electronico@example.com»
# Asunto del correo electrónico
ASUNTO=»Advertencia: El valor del parámetro f039 no es 0″
# Cuerpo del correo electrónico
CUERPO=»El valor del parámetro f039 es $valor en la siguiente línea del archivo de log $LOG_FILE: \n\n $linea»
# Envío del correo electrónico
echo -e «$CUERPO» | mail -s «$ASUNTO» «$DESTINATARIO»
fi
fi
done < "$LOG_FILE"
Para eso necesito configurar un demonio o servicio que envie el correo o que tenga las credenciales de acceso para poder enviar el correo de manera automatica con la sintaxis que tienes arriba. Supongamos que no quiero configurar el servicio de envio de correo pero si enviarlo por correo smtp al vuelo en el mismo script.
Ya probe la sintaxis y solo modifique una linea ya que no funcionaba la parte de LOG_FILE=»/ruta/al/archivo.log»
#!/bin/bash
# Nombre del archivo de log que deseas verificar
archivo_log=»Core.log.2023-04-25-13″
# Buscar las líneas que contienen el parámetro f039=
while read -r linea; do
if [[ «$linea» =~ f039=([0-9]+) ]]; then
valor=»${BASH_REMATCH[1]}»
if [ «$valor» != «0» ]; then
# Dirección de correo electrónico a la que se enviará la notificación
DESTINATARIO=»correo@dominio»
# Asunto del correo electrónico
ASUNTO=»Advertencia: El valor del parámetro f039 no es 0″
# Cuerpo del correo electrónico
CUERPO=»El valor del parámetro f039 es $valor en la siguiente línea del archivo de log $LOG_FILE: \n\n $linea»
# Envío del correo electrónico
echo -e «$CUERPO» | mail -s «$ASUNTO» «$DESTINATARIO»
fi
fi
done < "$archivo_log"
Me ayudas a quitar mi correo se me fue sin querer el nombre
Ya fue quitado
Hola. Buen día. Necesito de tu ayuda.
Para realizar un script de bash que pueda acceder al contenido de un log y buscar las palabras «error», «timeout»,»server is lost»
#ruta del log
/opt/clientes/logs/archivo.log
Que busque en los último 30 minutos como fecha_inicial=»$(date –d «30 min ago» +»%m/%d/%Y %H:%M:%S»)»
Que tome la hora y fecha actual, como fecha_final=»$(date +»%m/%d/%Y %H:%M:%S»)»
Con con la finalidad de NO recorrer el log desde inicio (son como 3 meses).
Si, encuentra un error, se debe enviar un correo :
#Destinatario
/usr/sbin/sendmail victor@dominio.com
#Asunto del correo
Subject: ATENCION
#Cuerpo del correo
Servidor AABBCC
01/19/2024 07:19:02 AABBC failed with 420: GSK_ERROR_SOCKET_CLOSED
Agradezco de antemano la ayuda que me puedas brindar.
Estimado, seria algo como el script que te muestro a continuación. Probe los comandos en un servidr LINUX y funciona perfectamente. El script no lo he probado en un ambiente Real. En otra ocasion lo probare y lo publicare ben mi pagina. Esto podrias ponerlo en una CRONTAB y ejecutarlos cada 30 minutos. De echo me gusto el planteamiento y voy a implementar algo asi en unos log que tengo. Quiza debas modificar algo, pero lo esencial lo hace correctamente. La fecha y hora hace 30 minutos y la captura de errores en el rango de fcha y hora. Para esto utilizo el comando AWK, por defecto viene instalado en la mayoria de las distribuciones linux. Si lo corres en otro server (Solaris, etc) este comando no funcionara y se debe adaptar otro.
#!/bin/bash
# Ruta del archivo de log
archivo_log="/ruta/del/archivo.log"
# Dirección de correo a la que se enviarán los errores
correo_destino="victor@dominio.com"
# Obtener la fecha y hora actual en el formato del log
fecha_actual=$(date +"%Y-%m-%d %H:%M")
# Calcular la fecha y hora hace 30 minutos en el formato del log
fecha_hace_30_minutos=$(date -d '30 minutes ago' +"%Y-%m-%d %H:%M")
# Buscar las líneas que contienen errores en el rango de tiempo especificado
errores=$(awk -v inicio="$fecha_hace_30_minutos" -v fin="$fecha_actual" '$1 " " $2 >= inicio && $1 " " $2 <= fin && /error|timeout|server is Lost/' "$archivo_log") # Verificar si se encontraron errores if [ -n "$errores" ]; then # Enviar correo con los errores echo -e "$errores" | mail -s "Atencion" "$correo_destino" fi
Lo acabo de publicar. Esta mas legible.