我已经设置了一个非常简单的脚本,以便我可以测试进程是否正在运行,如果是,那么它将触及文件,一切都会好起来的。但是,如果进程没有运行并且文件没有被触及,那么我希望能够设置警报。
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
也许可以考虑标准监控框架,它可能支持文件修改时间检查或这样做的插件,可定制的警报,指标,比上面更好的代码等。