Linux: monitorea el archivo de registro en busca de una cadena y ejecuta el script

Linux: monitorea el archivo de registro en busca de una cadena y ejecuta el script

Quiero monitorear un archivo de registro (syslog) en mi máquina Linux Debian. Entonces, si hay una nueva entrada con una cadena específica, quiero ejecutar un script.

Las cadenas son "inicio de alarma" y "fin de alarma".

Entonces debería verse así (sin lenguaje de programa, solo mi jerga ;-)):

if logfile has changed
get last line (or all new lines)
search for string
if string = "alarm start" found then /foo/bar/script_alarm_start.sh
if string = "alarm end" found then /foo/bar/script_alarm_end.sh

¿Hay algo así como un demonio que podría usar?

El archivo de registro se ve así:

Jul  7 06:38:17  zma_m1[8075]: INF [DoorCam: 898051 - Opening new event 14, alarm start]
Jul  7 06:38:23  zma_m1[8075]: INF [DoorCam: 898056 - Gone into alert state]
Jul  7 06:38:31  zmc_m1[8047]: INF [DoorCam: 900000 - Capturing at 25.00 fps]
Jul  7 06:38:33  zma_m1[8075]: INF [DoorCam: 898116 - Left alarm state (14) - 125(5) images]
Jul  7 06:38:33  zma_m1[8075]: INF [DoorCam: 898116 - Closing event 14, alarm end]
...
Jul  7 06:40:38  zma_m1[8075]: INF [DoorCam: 901286 - Opening new event 15, alarm start]
Jul  7 06:40:44  zma_m1[8075]: INF [DoorCam: 901289 - Gone into alert state]
Jul  7 06:40:53  zma_m1[8075]: INF [DoorCam: 901349 - Left alarm state (15) - 123(3) images]
Jul  7 06:40:53  zma_m1[8075]: INF [DoorCam: 901349 - Closing event 15, alarm end]

¡Salud!

Respuesta1

Prueba esto:

#!/bin/bash
function fs { ls -l LOGFILE | awk '{print $5}' }
function lc { wc -l LOGFILE | awk '{print $1}' }
function sv { fileSize=$(fs) fileLength=$(lc)  }
function ov { nFileSize=$(fs) nFileLeng=$(fs)  }
sv
while true; do
    ov
    if [[ $nFileSize != $fileSize ]]; then
        newLines=$(tail -n $(($nFileLeng-$fileLength)))
        if [[ $(echo "$newLines" | grep "alarm start") ]]; then
            /foo/bar/script_alarm_start.sh
        elif [[ $(echo "$newLines" | grep "alarm end") ]]; then
            /foo/bar/script_alarm_end.sh
        fi
    fi
    sv
done

Cambie LOGFILE a la ubicación de su archivo de registro

información relacionada