如果进程停止接触文件,则创建警报通知

如果进程停止接触文件,则创建警报通知

我已经设置了一个非常简单的脚本,以便我可以测试进程是否正在运行,如果是,那么它将触及文件,一切都会好起来的。但是,如果进程没有运行并且文件没有被触及,那么我希望能够设置警报。

pgrep "sleep" >/dev/null && 触摸监视器.log

该脚本每分钟在 crontab 中运行一次。我需要一种方法让它在文件未被触及时发出警报?这可能吗?

谢谢

答案1

这是一个简单的文件修改时间检查;复杂性主要来自于每天可能出现多达 86,400 个警报(通常在长假周末是这类事情发生的时候),以及修改时间检查器(或 cron 或系统是否...)的其他复杂性。 .) 实际上正在运行,主机时钟是否正确(virt 上的时间偏差、未来四年的 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

也许可以考虑标准监控框架,它可能支持文件修改时间检查或这样做的插件,可定制的警报,指标,比上面更好的代码等。

相关内容