프로세스가 파일 접촉을 중지하면 경고 알림 생성

프로세스가 파일 접촉을 중지하면 경고 알림 생성

프로세스가 실행 중인지 테스트할 수 있도록 매우 간단한 스크립트를 설정했습니다. 실행 중인 경우 파일을 건드리면 모든 것이 정상이 될 것입니다. 하지만 프로세스가 실행되고 있지 않고 파일을 건드리지 않은 경우 경고를 설정할 수 있었으면 좋겠습니다.

pgrep "sleep" >/dev/null && 터치 monitor.log

이 스크립트는 매분마다 crontab에서 실행됩니다. 파일을 터치하지 않았을 때 경고를 표시하는 방법이 필요합니까? 가능합니까?

감사해요

답변1

이것은 간단한 파일 수정 시간 확인입니다. 복잡성은 주로 하루에 최대 86,400개의 경고가 나타날 수 있다는 사실(보통 긴 휴일 주말에 이런 일이 발생함)과 수정 시간 검사기(또는 cron 또는 시스템... .) 추가 복잡성. .)이 실제로 실행 중이고 호스트 시계가 정확합니까(virt의 시간 차이, 향후 4년 후의 BIOS 시계, 손상된 NTP 등).

#!/bin/sh

# what we're checking for mtime changes straying from the current system time
MONITOR=foofile
THRESHOLD=60

# use mtime on this file to avoid frequent alert spam should the above stop
# being updated
LAST_ALERT=barfile
LAST_ALERT_THRESHOLD=60

NOW_MTIME=`date +%s`

absmtimedelta() {
    delta=`expr $NOW_MTIME - $1`
    # absolute delta, in the event the mtime is wrong on the other side of
    # the current time
    echo $delta | tr -d -
}

alertwithlesscronspam() {
    msg=$1
    if [ ! -f "$LAST_ALERT" ]; then
        # party like it's
        touch -t 199912312359 -- "$LAST_ALERT"
    fi
    # KLUGE this stat call is unportable, but that's shell for you
    last_mtime=`stat -c '%Y' -- "$LAST_ALERT"`
    last_abs_delta=`absmtimedelta $last_mtime`
    if [ $last_abs_delta -gt $LAST_ALERT_THRESHOLD ]; then
        # or here instead send smoke signals, carrier pigeon, whatever
        echo $msg
        touch -- "$LAST_ALERT"
        exit 1
    fi
}

if [ ! -r "$MONITOR" ]; then
    alertwithlesscronspam "no file alert for '$MONITOR'"
fi

MONITOR_MTIME=`stat -c '%Y' -- "$MONITOR"`
ABS_DELTA=`absmtimedelta $MONITOR_MTIME`

if [ $ABS_DELTA -gt $THRESHOLD ]; then
    alertwithlesscronspam "mtime alert for '$MONITOR': $ABS_DELTA > $THRESHOLD"
fi

아마도 고려해 보세요표준 모니터링 프레임워크, 파일 수정 시간 확인 또는 이를 위한 플러그인, 사용자 정의 가능한 경고, 메트릭, 위보다 더 나은 코드 등을 지원할 수 있습니다.

관련 정보