使用bash,当文件停止更新时如何获得警报?

问题描述

如果文件在x分钟内没有更改,我想通过电子邮件发出警报。

对于上下文,应用程序正在无人值守的系统上运行24/7收集推文。如果存储推文的文件在x分钟内没有变化,我需要检查应用程序是否未意外终止。

有什么想法吗?我考虑过watch,但是我对bash和Linux还是陌生的。

解决方法

例如,在目录“ tmp”中有一个名为“ tweets”的文件,我们可以运行一个脚本,其中将find与mmin标志结合在一起。我们可以用-5表示最近5分钟内对该文件的任何更改。如果find命令返回的文件数不为0(通过管道传递到wc -l),则运行命令发送电子邮件。

#!/bin/bash

if [[ "$(find /tmp -name "*tweets" -mmin -5 | wc -l)" != "0" ]]
then
     echo "There is an issue" | mailx -s alert someone@someemail.com
fi

然后可以将其设置为每隔5分钟运行一次cron作业。

,

好吧,如果您说服务不是那么关键,则可以创建一个cronjob来检查特定文件的修改时间,并在满足某些条件时调用警报脚本。

在这种情况下,请用谷歌搜索“ crontab”,“查找mmin”之类的关键字,然后建立您的cronjob。

否则,海事组织(IMO),一个好的方法就是使用类似grafana的东西。您可以在此处定义事件发生时如何通知您或您的团队。

您的程序需要以某种方式注册其状态。例如。普罗米修斯指标。

通过这种方式,您的警报/监视与运行应用程序的服务器分离。您还可以跟踪服务的所有历史状态。

考虑是否在服务器上运行cronjob或shell脚本以检查文件修改时间戳并在发生某些事件时发出警报。如果服务器关闭,您将不会收到警报,当然,您认为服务运行良好。

再次,这取决于您的服务有多重要。

,

使用inotifywait

#!/usr/bin/env sh

MONITOREDFILE=/path/to/monitoredfile

TIMEOUT=600 # 600s or 10 minutes

EMAIL=user@example.com

lastmodified="monitoring started on $(date -R)"
while inotifywait \
  --quiet \
  --timeout $TIMEOUT \
  --event 'MODIFY' \
  "$MONITOREDFILE"
do
  printf '%s has been modified before %s seconds timeout\n' \
  "$MONITOREDFILE" $TIMEOUT
  lastmodified=$(date -R)
done
printf '!!! ALERT !!!\nFile %s has not been modified since %s seconds\n' \
    "$MONITOREDFILE" $TIMEOUT >&2
mailx -s "Stalled file $MONITOREDFILE" "$EMAIL" <<ENDOFMAIL
Monitored file $MONITOREDFILE has not been modified since $lastmodified.
ENDOFMAIL

使用GNU date获取文件最后一次修改并使循环为空的另一种方法:

#!/usr/bin/env sh

MONITOREDFILE=/path/to/monitoredfile
TIMEOUT=600 # 600s or 10 minutes
EMAIL=user@example.com

while inotifywait --quiet --timeout $TIMEOUT --event 'MODIFY' "$MONITOREDFILE"
do :;done
lastmodified=$(date --utc --iso-8601=seconds --reference="$MONITOREDFILE")
mailx -s "Stalled file $MONITOREDFILE" "$EMAIL" <<ENDOFMAIL
Monitored file $MONITOREDFILE has not been modified since $lastmodified.
ENDOFMAIL