내 Linux Debian 상자에서 로그 파일(syslog)을 모니터링하고 싶습니다. 따라서 특정 문자열이 포함된 새 항목이 있으면 스크립트를 실행하고 싶습니다.
문자열은 "알람 시작" 및 "알람 종료"입니다.
따라서 다음과 같아야 합니다(프로그램 언어는 없고 단지 내 속어입니다. ;-)):
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
내가 사용할 수 있는 데몬과 같은 것이 있습니까?
로그 파일은 다음과 같습니다.
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]
건배!
답변1
이 시도:
#!/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
LOGFILE을 로그 파일 위치로 변경합니다.