linux: monitore logfile para uma string e execute script

1

Eu quero monitorar um arquivo de log (syslog) na minha caixa Debian linux. Então, se houver uma nova entrada com uma string secreta, quero executar um script.

As sequências são "início do alarme" e "fim do alarme"

Portanto, deve ser assim (sem linguagem de programação, apenas a minha gíria; -)):

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

Existe algo como um daemon que eu poderia usar?

Logfile tem esta aparência:

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]

Felicidades!

    
por whopperg 07.07.2014 / 13:48

1 resposta

-2

Tente isto:

#!/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

Altere LOGFILE para o local do seu arquivo de log

    
por 07.07.2014 / 19:20