Estoy buscando comparar la salida de un archivo entre marcos de tiempo. Ejemplo: Ejecuta el comando y genera un valor numérico de 1 a 1000 (1-1000). Necesito ejecutar el mismo comando 15 minutos después y ver si ha aumentado en 20 y, de ser así, enviar un correo electrónico.

Estoy pensando que esto es muy simple, sin embargo, no puedo entender por dónde empezar.

Pensaría que tendría que ejecutar el comando y la salida al archivo y cuando el comando se ejecute nuevamente en 15 minutos compare esos valores. Pensaría que necesitaría verificar si el archivo de salida existe y luego crear si no.

Soy nuevo en las secuencias de comandos y podría usar la ayuda. Obtuve el siguiente, pero estoy atrapado más allá. Estoy tratando de hacer esto lo más simple posible

#!/bin/bash

today="date '+%Y_%m_%d'"
command="echo "select count(status) from alarm where status ='open'" | my-db"
# the command above will return the following for example
#count(status)
#34

$command > /tmp/$today.dblogout 
2
decini 22 ene. 2018 a las 22:19

3 respuestas

La mejor respuesta

Simplemente puede mantener el último valor conocido (último recuperado) en un archivo temporal, y cada vez que se ejecuta el script, verifique cuánto ha aumentado el valor desde la última ejecución (actualizando el último valor conocido en el camino).

Por ejemplo:

#!/bin/bash
store=/tmp/last_value
threshold=20

last=$(<"$store")
current=$(my-db <<<"select count(status) from alarm where status = 'open'" | tee "$store")

if (( current - last > threshold )); then
    echo "Sending mail..."
fi
2
randomir 22 ene. 2018 a las 19:43

Un par de opciones

  • Si la tabla de alertas tiene una columna de fecha, puede escribir una consulta SQL para obtener el recuento por usted.
  • Usa bash para obtener los valores

    #!/bin/bash
    
    # Store date in a variable, note the $( ) surrounding the command
    today="$(date '+%Y_%m_%d')"
    old=0
    
    # read the old value from file if it exists
    if [ -f /tmp/$today.dblogout ]; then
        old="$(< /tmp/$today.dblogout)"
    fi
    
    # store just the value without any header
    new=$(echo "select count(status) from alarm where status ='open'" | my-db)
    # the command above will return the following for example
    #34
    
    # response is not empty
    if [ -z "$new" ]; then
        echo "old count: $old, new count: $new"
    else
        echo "new value is empty. old value: $old"
    fi
    
    # store the new value
    echo "$new" > /tmp/$today.dblogout
    
1
Luis Muñoz 22 ene. 2018 a las 19:42

Hice algo similar para alertarme si mi disco se está llenando:

#!/bin/sh

THRESHOLD=85

datafile=/var/run/df_slash_var_pcent_avail.txt

# get previous value:
prev=$(tail -1 $datafile | cut -d\  -f2)

# get current value
curr=$(($(df /var --output=pcent | tail -1 | cut -d% -f1) + 0))

# store current value
echo "$(date +%s) $curr" >> $datafile

# if getting worse, alert
[[ $curr > $THRESHOLD ]] && [[ $curr > $prev ]] && smsme "/var grew from ${prev}% to ${curr}%" 

Este script es bastante sencillo. No dude en preguntar si algo no está claro.

1
Setop 22 ene. 2018 a las 19:37